Mengapa ekspresi (int) + 1e10 tidak menghasilkan -2147483648 seperti yang dijelaskan CSAPP? [duplikat]
Saya membaca CS: APP (perakitan x86-64 / buku teks tingkat rendah) dan menyebutkan:
Dari
float
ataudouble
keint
, nilai akan dibulatkan menuju nol. Misalnya,1.999
akan diubah menjadi1
, sementara−1.999
akan dikonversi ke−1.
Selanjutnya, nilainya mungkin meluap. Standar C tidak menentukan hasil tetap untuk kasus ini. Mikroprosesor yang kompatibel dengan Intel menetapkan pola bit [10 ... 00] (TMinw
untuk ukuran kataw
) sebagai nilai tak terbatas bilangan bulat. Setiap konversi dari floating point ke integer yang tidak dapat menetapkan perkiraan integer yang wajar menghasilkan nilai ini. Dengan demikian, ekspresi tersebut(int) +1e10
menghasilkan-2147483648
, menghasilkan nilai negatif dari yang positif.
Apa mikroprosesor kompatibel Intel yang disebutkan di sini? x86
arsitektur termasuk seri AMD?
Bagaimanapun, saya memiliki Intel i5 dengan mesin Win10 64bit dan saya mencoba di bawah Visual Studio:
#include <iostream>
using namespace std;
int main() {
int b = (int)+1e10;
cout << b << endl;
}
dan menjadi 1410065408
keluaran.
Saya juga mencoba int32_t
dan mendapatkan 1410065408
juga.
Jadi kenapa tidak saya memiliki hasil -2147483648
yang [10 ... 00]
sebagai buku menjelaskan?
Jawaban
Bahkan jika prosesor yang digunakan memiliki "Setiap konversi dari titik mengambang ke bilangan bulat yang tidak dapat menetapkan perkiraan bilangan bulat yang wajar menghasilkan nilai ini.", Kompilator tidak diharuskan untuk mengikutinya karena dapat menggunakan kode lain untuk mencapai tujuan.
Secara khusus, nilai yang dapat ditentukan pada waktu kompilator seperti some_32_bit_int = (int)+1e10;
mungkin mendapatkan nilai seperti some_32_bit_int = 10000000000 & 0xFFFFFFFF;
atau 1410065408
yang sepenuhnya tidak bergantung pada prosesor.
Jika nilai bagian integral tidak dapat diwakili oleh tipe integer, perilaku tidak ditentukan.
C17dr § 6.3.1.4 1
Buku tersebut menjelaskan tentang prosesor, bukan kompilernya.