Kelimpahan Jawaban Mengerikan
Ozgur Ozcitak
Ketika Anda memilih dari masuk ke yang tidak ditandatangani (dan sebaliknya) representasi internal dari nomor tidak berubah. Apa yang berubah adalah bagaimana kompiler menginterpretasikan bit tanda.
Ini sepenuhnya salah.
Mats Fredriksson
Ketika satu unsigned dan satu variabel yang ditandatangani ditambahkan (atau operasi biner) keduanya secara implisit dikonversi menjadi unsigned, yang dalam hal ini akan menghasilkan hasil yang sangat besar.
Ini juga salah. Int yang tidak ditandatangani dapat dipromosikan ke int jika mereka memiliki presisi yang sama karena bit padding dalam tipe yang tidak ditandatangani.
smh
Operasi penjumlahan Anda menyebabkan int dikonversi menjadi int yang tidak ditandatangani.
Salah. Mungkin ya dan mungkin juga tidak.
Konversi dari int yang tidak ditandatangani ke int yang ditandatangani bergantung pada implementasi. (Tapi mungkin ini bekerja seperti yang Anda harapkan pada sebagian besar platform saat ini.)
Salah. Entah itu perilaku yang tidak terdefinisi jika menyebabkan overflow atau nilainya dipertahankan.
Anonim
Nilai i dikonversi ke int unsigned ...
Salah. Tergantung pada ketepatan int relatif terhadap int unsigned.
Taylor Price
Seperti yang telah dijawab sebelumnya, Anda dapat melakukan bolak-balik antara yang ditandatangani dan yang tidak ditandatangani tanpa masalah.
Salah. Mencoba menyimpan nilai di luar rentang bilangan bulat yang ditandatangani menghasilkan perilaku yang tidak terdefinisi.
Sekarang saya akhirnya bisa menjawab pertanyaan itu.
Jika presisi int sama dengan int unsigned, u akan dipromosikan ke int yang ditandatangani dan Anda akan mendapatkan nilai -4444 dari ekspresi (u + i). Sekarang, jika Anda dan saya memiliki nilai-nilai lain, Anda mungkin mendapatkan perilaku overflow dan undefined tetapi dengan angka-angka yang tepat Anda akan mendapatkan -4444 [1] . Nilai ini akan memiliki tipe int. Tetapi Anda mencoba untuk menyimpan nilai itu ke int yang tidak ditandatangani sehingga kemudian akan dilemparkan ke int yang tidak ditandatangani dan nilai yang hasilnya akan berakhir adalah (UINT_MAX + 1) - 4444.
Jika presisi dari unsigned int lebih besar daripada int, int yang ditandatangani akan dipromosikan ke int unsigned yang menghasilkan nilai (UINT_MAX + 1) - 5678 yang akan ditambahkan ke int unsigned 1234 yang lain. Haruskah Anda dan saya memiliki nilai-nilai lain, yang membuat ekspresi berada di luar rentang {0..UINT_MAX} nilai (UINT_MAX + 1) akan ditambahkan atau dikurangi hingga hasilnya TIDAK termasuk dalam rentang {0..UINT_MAX) dan tidak ada perilaku tidak terdefinisi yang akan terjadi .
Apa itu presisi?
Integer memiliki bit padding, bit tanda, dan bit nilai. Bilangan bulat yang tidak ditandai tidak memiliki sedikit tanda. Selanjutnya, unsigned char dijamin tidak memiliki bit padding. Jumlah bit nilai yang dimiliki integer adalah seberapa banyak presisi yang dimilikinya.
[Gotchas]
Ukuran makro dari makro saja tidak dapat digunakan untuk menentukan presisi dari bilangan bulat jika bit bantalan hadir. Dan ukuran byte tidak harus berupa octet (delapan bit) seperti yang didefinisikan oleh C99.
[1] Overflow dapat terjadi pada salah satu dari dua titik. Baik sebelum penambahan (selama promosi) - ketika Anda memiliki int unsigned yang terlalu besar untuk masuk ke dalam int. Overflow juga dapat terjadi setelah penambahan bahkan jika int unsigned berada dalam kisaran int, setelah penambahan hasilnya mungkin masih meluap.