Soalan 1:
Bagaimana anda memahami ayat "Apabila kami menetapkan nilai kepada jenis yang tidak ditandatangani yang melebihi julat perwakilannya, hasilnya ialah baki modulo nilai awal jumlah bilangan nilai yang diwakili oleh jenis yang tidak ditandatangani" ? Sebagai contoh, mengapakah hasil penugasan -1 kepada 8-bit unsigned char 255?
Pemahaman saya ialah: Jika -1=11111111 (1 pertama mewakili negatif), apabila ia dinyatakan sebagai tidak ditandatangani, 11111111=255
Jadi mengapa menetapkan jenis yang ditandatangani menghasilkan nilai yang melebihi julat perwakilannya Adakah ia tidak ditentukan?
Soalan 2
Apabila kedua-dua jenis yang ditandatangani dan tidak ditandatangani muncul dalam ungkapan aritmetik, apabila nilai jenis yang ditandatangani ialah nombor positif, adakah nilai selepas penukaran kepada tidak ditandatangani sama seperti sebelum penukaran? Sebagai contoh, jika int a=1, unsigned b=1, apabila mengeluarkan a+b, a akan ditukar kepada unsigned dahulu Adakah a akan sama dengan 1 selepas penukaran? Jika int a=-1, unsingned b=2, apabila mengeluarkan a+b, a akan ditukar kepada jenis unsigned dahulu Apakah nilai a selepas penukaran?
Soalan 2:
Seperti yang ditunjukkan dalam komen panjang keempat dalam gambar.
Apa yang dikatakan oleh buku ialah tidak kira apa keputusan a+b, selagi satu daripada a dan b tidak ditandatangani dan yang lain ditandatangani, yang ditandatangani mesti ditukar kepada tidak ditandatangani sebelum melakukan penambahan. Selepas saya benar-benar menjalankan program dalam gambar, saya fikir bahawa hanya apabila hasil a+b ialah nombor negatif dan satu daripada a dan b ditandatangani dan satu lagi tidak ditandatangani, hasilnya akan ditukar kepada tidak bertanda.
Mana satu betul?
Soalan 1
Sebenarnya, penjelasan di atas adalah rumit Jika anda melihat dari sudut ingatan, anda akan mendapati bahawa ia adalah sangat mudah. Perbezaan antara tidak ditandatangani dan ditandatangani bukanlah penyimpanan memori, tetapi pemerolehan ingatan. Sebagai contoh, dalam contoh anda memberikan 8 bit kepada -1, jika ia tidak ditandatangani, hanya 8 bit perduaan terakhir akan diisi, dan selebihnya akan dibuang. Kerana 8bit ini tidak ditandatangani, semua bit binari di dalamnya mewakili nombor, jadi ia adalah 255. Tetapi jika ia adalah 8-bit yang ditandatangani, binari pertama mewakili bit tanda, tetapi apabila menetapkan, bit tanda -1 tidak menjadi bit tanda data 8-bit, jadi bit tanda 8-bit data sebenarnya tidak sah, jadi tugasan ini adalah Sesuatu yang tidak kena. Ayat itu bermaksud (-1)%256=255, di mana 256 ialah jumlah bilangan (atau julat) 8bit yang tidak ditandatangani.
Soalan 2
Seperti yang dinyatakan di atas, sebenarnya cara penyimpanan signed dan unsigned adalah sama, tetapi kaedah bacaannya berbeza. Yang ditandatangani akan menganggap bit pertama sebagai bit tanda, dan yang tidak bertanda akan menganggap bit pertama sebagai bit angka. Ia adalah sama dalam ingatan Dalam contoh anda, hasil kali pertama a + b ialah sekumpulan 1 dalam perwakilan binari. Jika anda mengeluarkan secara langsung, kerana ia ditukar kepada tidak ditandatangani, iaitu, dua tidak ditandatangani ditambah, hasilnya tidak ditandatangani, dan output perduaan bagi sekumpulan 1 sebagai tidak ditandatangani ialah 4294967295, tetapi jika a+b ditugaskan kepada jumlah, jumlah menyimpan nilai. Masih terdapat sekumpulan 1 dalam ingatan, tetapi oleh kerana jumlah adalah int bertanda, apabila membaca, bit pertama dianggap sebagai bit tanda, jadi nilai baca ialah -1.
Jadi dalam soalan anda 2, bukan tiada penukaran semasa operasi, tetapi kerana hanya binari yang dipertimbangkan semasa menyimpan nilai, dan tidak ada perbezaan sama ada terdapat tanda atau tidak. Bit tanda hanya dinilai apabila membaca, yang membawa kepada perbezaan dalam hasil output.