C語言 關於資料在記憶體中的儲存易錯題(3)

2021-08-21 15:36:19 字數 1495 閱讀 2500

1.輸出什麼?

#includeint main()

結果:4294967168

十六進製制:0x ff ff ff 80

分析:首先寫出-128:

10000000 00000000 00000000 10000000--->原碼

11111111 11111111 11111111 01111111--->反碼

11111111 11111111 11111111 10000000--->補碼

結果存到到a裡面去,a只有乙個位元組,是8個位元位的空間,如果想要把這四個位元組的內容存起來的話,則選擇最低的位元組進行儲存,所以存到a裡面的實際上是:

10000000,最後是以%u的形式列印,而%u是整形,怎麼才能是整形呢?就要進行整形提公升,我們發現a是有符號的char,它的最高位是1,整形提公升的時候,如果是有符號數,前面補的是符號位,而char型別的-128的最高位是1,所以前面就補1,補完之後為:

11111111 11111111 11111111 10000000

最後列印的時候,是以%u的形式輸出,%u是無符號的整形,而無符號數的原碼,反碼及補碼都是一樣的,所以最後輸出結果為:

11111111 11111111 11111111 10000000---->十六進製制:0x ff ff ff 80/十進位制:4294967168

2.輸出什麼?

#include#includeint main()

結果:4294967168

分析:這道題和上面的計算方法是一樣的,128的二進位制序列寫出來是:

00000000 00000000 00000000 10000000  這個數字如果要存到記憶體中去的話,只能存8個位元位,如果想要把這四個位元組的內容存起來的話,則選擇最低的位元組進行儲存,所以存到a裡面的實際上是:

10000000,最後是以%u的形式列印,而%u是整形,怎麼才能是整形呢?就要進行整形提公升,我們發現a是有符號的char,它的最高位是1,整形提公升的時候,如果是有符號數,前面補的是符號位,而char型別的128的最高位是1,所以前面就補1,補完之後為:

11111111 11111111 11111111 10000000

最後列印的時候,是以%u的形式輸出,%u是無符號的整形,而無符號數的原碼,反碼及補碼都是一樣的,所以最後輸出結果為:

11111111 11111111 11111111 10000000---->十六進製制:0x ff ff ff 80/十進位制:4294967168

通過上面這兩個題,我們發現-128和128存在記憶體中的二進位制序列是一模一樣的。

需要注意的是:整形提公升時,前面補的是符號位;如果是有符號數char a,前面補的是符號位(存在a裡面的的最高位就是所謂的符號位),比如char型別的128的最高位是1,如果存進去的8位裡面,最高位是0的話,那麼認為它的符號位就是0,整形提公升時,高位就補0;如果存進去的是乙個無符號數,整形提公升時,高位補的都是0,因為無符號數是沒有符號位的,高位就只能補0了。

C語言 資料在記憶體中的儲存

字元型資料 1.字元與字元 把字元的相對應的ascii碼 整數,對映關係見ascii碼表 放到儲存碼單元中,而這些ascii 值在計算機中同樣以二進位制補碼的形式存放的。2.字元變數 字元型資料的儲存空間和值的範圍 32位操作平台 型別位元組數 取值範圍 signed char 有符號字元數 1 2...

資料在記憶體中的儲存c語言

基本內建型別 char 字元資料型別 short 短整型 int 整形 long 長整型 long long 更長的整形 float 單精度浮點數 double 雙精度浮點數使用這個型別開闢的記憶體空間大小 大小決定了適用範圍 如何看待記憶體空間的視角。在32位平台下,任何指標型別都只佔4個位元組。...

C語言 資料在記憶體中的儲存

得從整形在記憶體中的儲存說起 計算機中的有符號數有三種表示方法,即原碼 反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示 正 用1表示 負 而數值位三種表示方法各不相同。原碼直接將二進位制按照正負數的形式翻譯成二進位制就可以。反碼將原碼的符號位不變,其他位依次按位取反就可以得到了...