Mengapa ekspresi (int) + 1e10 tidak menghasilkan -2147483648 seperti yang dijelaskan CSAPP? [duplikat]

Dec 12 2020

Saya membaca CS: APP (perakitan x86-64 / buku teks tingkat rendah) dan menyebutkan:

Dari floatatau doubleke int, nilai akan dibulatkan menuju nol. Misalnya, 1.999akan diubah menjadi 1, sementara −1.999akan 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] ( TMinwuntuk ukuran kata w) 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) +1e10menghasilkan -2147483648, menghasilkan nilai negatif dari yang positif.

Apa mikroprosesor kompatibel Intel yang disebutkan di sini? x86arsitektur 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 1410065408keluaran.

Saya juga mencoba int32_tdan mendapatkan 1410065408juga.

Jadi kenapa tidak saya memiliki hasil -2147483648yang [10 ... 00]sebagai buku menjelaskan?

Jawaban

2 chux-ReinstateMonica Dec 12 2020 at 09:49

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 1410065408yang 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.