Rumah > Artikel > pembangunan bahagian belakang > Mewakili dan Memanipulasi Maklumat dalam komputer moden - Bahagian 2
Pautan ke Bahagian 1
Int 4-bait dalam mesin 32-bit menyimpan semua 4 baitnya dalam jujukan bait bersambung. Ia boleh disimpan dalam dua cara iaitu Little endian dan Big endian bergantung kepada mesin. Tidak begitu terperinci, Little endian menyimpan int(4bait pada 32-bit) nilai heksadesiaml 0x01234567 seperti berikut (dengan andaian alamat permulaan ialah 0x100):
Alamat/Nilai
0x100 67
0x101 45
0x102 23
0x103 01
dan endian besar yang serupa akan kelihatan seperti berikut:
Alamat/Nilai
0x100 01
0x101 23
0x102 45
0x103 67
Saya harap anda dapat melihat perbezaan dalam pesanan. Linux 32bit, Windows, Linux 64bit mengikuti Little endian manakala SunOS/SPARC mengikuti Big endian.
Ini penting kerana apabila menghantar mesej melalui rangkaian daripada mesin pesanan bait endian kecil kepada mesin pesanan bait endian besar dan sebaliknya boleh menjadi masalah. Kebanyakan pengaturcara tidak mendapati ia adalah isu kerana aplikasi rangkaian ditulis dalam cara yang melakukan penukaran ini untuk kami tetapi jika anda menulis aplikasi rangkaian, anda mungkin perlu mempertimbangkan perkara ini.
Anda mungkin terkejut mengetahui, menambah dua nombor positif boleh menghasilkan nombor negatif dan x < y boleh memberi anda hasil yang berbeza kemudian x - y < 0.
Biar saya berikan contoh kepada anda, katakan kami mempunyai komputer yang menyimpan int sebagai 4-bit dan kami mempunyai dua int tidak bertanda x dan y.
int x yang tidak ditandatangani = 10; // wakil binari: 1010
int y tidak ditandatangani = 15; // wakil binari: 1111
unsigned int z = x y; // ???
Nilai z ialah 25. betul tak? betul tak?
Tidak. Jika anda menukar 25 kepada perwakilan binarinya, ia akan menjadi 11001 tetapi seperti yang saya nyatakan komputer kita hanya boleh menyimpan integer 4-bit (nilai dari 0-15 incase yang tidak ditandatangani). Jadi, apakah yang akan dilakukan oleh komputer kita dengan 1-bit tambahan? Anda betul, ia akan menjatuhkan bit tertib lebih tinggi (bit pertama dari kiri) dan kami akan mendapat 1001 yang bertukar kepada 9. Ini sama seperti melakukan modul dengan 16 iaitu 25 mod 16=9. Tingkah laku komputer yang tidak terhad kepada artmetik ini juga dipanggil Limpahan.
Tetapi mengapa saya menggunakan unsigned int di sini? Adakah penambahan ini akan berkelakuan berbeza dengan integer yang ditandatangani?
Jawapan: Ya tetapi sebelum menerangkan apa yang akan berlaku dan bagaimana komputer kita berakhir dengan itu, mari kita fahami dahulu cara ditandatangani dan tidak ditandatangani adalah berbeza dengan integer saiz 4-bit kami.
Mereka boleh menyimpan positif dan negatif kedua-dua nilai nombor daripada -8(bin rep: 1000) hingga 7(bin rep: 0111). Bit tertib lebih tinggi (bit pertama dari kiri) ialah bit yang memberikan nilai negatif integer bertanda dan bit yang selebihnya menghasilkan positif. Jadi, untuk mendapatkan nombor terkecil kita perlu menukarkan tertib lebih tinggi kepada 1 dan bit lain 0 dan untuk mendapatkan nombor terbesar kita perlu membalikkan bit tertib lebih tinggi kepada 0 dan bit lain kepada 1.
Mereka hanya boleh menyimpan nilai nombor positif daripada 0(perduaan rep: 0000) hingga 15(bin rep: 1111).
Sekarang, kerana x=10 dan y=15 akan melimpah sebelum penambahan, kita akan menggunakan sesuatu yang lebih kecil:
int x = 5; // 0101
int y = 6; // 0110
int z = x y // ???
Perwakilan binari hendaklah 1011 jika kita mengabaikan pertimbangan yang ditandatangani. Seperti yang anda lihat, bit tertib lebih tinggi dibalikkan kepada 1 dan dari atas, nilai z ialah -5(= -1*2ˆ3 2ˆ1 2ˆ0) bukannya 11.
dan juga, menambah dua negatif boleh menghasilkan postivie. cth,
int x = -8 // 1000
int y = -5 // 0101
int z = x y // ???
Sekarang z akan menjadi -13 iaitu 10011 dalam binari(bit tertib tinggi adalah untuk negatif iaitu -1*2ˆ4 = -16) tetapi komputer kita hanya boleh menyimpan 4-bit supaya ia akan menjatuhkan bit tertib lebih tinggi dan menjadi 0011 iaitu 3 dalam perpuluhan. Sekali lagi, melimpah.
Inilah sebabnya x < y boleh terhasil secara berbeza daripada x - y < 0 jika kita tidak mengendalikan limpahan artmetik dengan betul. Sebagai seorang pengaturcara, kita harus sentiasa memberi perhatian semasa memilih jenis data dengan mempertimbangkan kapasiti dan gelagatnya dalam situasi yang berbeza kerana ia mungkin akibat daripada penyahpepijatan berjam-jam.
Itu sahaja untuk hari ini. Sila komen jika ada maklumat di sini salah atau tiada. Terima kasih.
Atas ialah kandungan terperinci Mewakili dan Memanipulasi Maklumat dalam komputer moden - Bahagian 2. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!