Bu sorunun cevaplarını okurken, bu yoruma rastladım [düzenlendi].
2'nin 0100 (4) tamamlayıcısı 1100 olacaktır. Normal olarak söylersem 1100 şimdi 12 olur. Yani, normal 1100 dediğimde 12 olur, ama 2'nin 1100 tamamlayıcısı dediğimde -4? Ayrıca, Java'da 1100 (şimdilik 4 bit olduğunu varsayalım) saklanırsa, +12 veya -4 olup olmadığı nasıl belirlenir? - hagrawal 2 Temmuz, 16:53
Benim düşünceme göre, bu yorumda sorulan soru oldukça ilginç ve bu yüzden her şeyden önce onu yeniden ifade etmesini ve sonra bir cevap ve bir örnek vermesini istiyorum.
SORU - Sistem, bir veya daha fazla bitişik baytın nasıl yorumlanması gerektiğini nasıl belirleyebilir? Özellikle, sistem belirli bir bayt dizisinin düz bir ikili sayı mı yoksa 2'nin tamamlayıcı numarası mı olduğunu nasıl belirleyebilir?
CEVAP - Sistem, bir bayt dizisinin tipler yoluyla nasıl yorumlanacağını belirler. Türleri tanımlar
- kaç bayt dikkate alınmalı
- bu baytların nasıl yorumlanması gerektiği
ÖRNEK - Aşağıda varsayıyoruz
char
1 bayt uzunluğunda
short
2 bayt uzunluğunda
int
's ve float
' ler 4 bayt uzunluğunda
Bu boyutların sistemime özel olduğunu lütfen unutmayın. Oldukça yaygın olmasına rağmen, sistemden sisteme farklı olabilirler. Sisteminizde ne olduklarını merak ediyorsanız sizeof operatörünü kullanın .
Her şeyden önce 4 bayt içeren bir dizi tanımlarız ve hepsini 10111101
onaltılı sayıya karşılık gelen ikili sayıya başlatırız BD
.
// BD(hexadecimal) = 10111101 (binary)
unsigned char l_Just4Bytes[ 4 ] = { 0xBD, 0xBD, 0xBD, 0xBD };
Ardından dizi içeriğini farklı türler kullanarak okuruz.
unsigned char
ve signed char
// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );
// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char -> %i\n", *( ( signed char* )l_Just4Bytes ) );
unsigned short
ve short
// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );
// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short -> %hi\n", *( ( short* )l_Just4Bytes ) );
unsigned int
, int
vefloat
// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );
// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int -> %i\n", *( ( int* )l_Just4Bytes ) );
// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float -> %f\n", *( ( float* )l_Just4Bytes ) );
RAM'deki 4 bayt (l_Just4Bytes[ 0..3 ]
) her zaman aynı kalır. Değişen tek şey onları nasıl yorumladığımızdır.
Yine, biz sistemini anlatmak nasıl ile yorumlanması türleri .
Örneğin, yukarıda l_Just4Bytes
dizinin içeriğini yorumlamak için aşağıdaki türleri kullandık
unsigned char
: Düz ikili dosyada 1 bayt
signed char
: 2 tamamlayıcıda 1 bayt
unsigned short
: Düz ikili gösterimde 2 bayt
short
: 2'nin tamamlayıcısında 2 bayt
unsigned int
: Düz ikili gösterimde 4 bayt
int
: 2 tamamlayıcıda 4 bayt
float
: IEEE 754 tek kesinlikli gösterimde 4 bayt
[EDIT] Bu yayın, user4581301 tarafından yapılan yorumdan sonra düzenlendi. Bu yararlı satırları bırakmak için zaman ayırdığınız için teşekkür ederiz!