C語言各種類型所佔字節數「c語言中一個數字占幾個字節」

char和int類型都是有符號數類型,char類型的變量佔據1個字節的容量,int類型的變量佔據4個字節的容量。那麼,把char類型變量賦給int類型變量,會有什麼問題產生?

我們會很直觀地認為,把1個字節大小的數據,放入4個字節大小的容量,沒有任何問題啊!我們做如下的一個測試例子:

C語言的有符號數的符號位擴展,老司機都滑到

程序運行結果如下:

C語言的有符號數的符號位擴展,老司機都滑到

可以看到b的結果也是-1,這是因為,把char類型變量賦值給放入int類型變量時,是把char類型變量的數據放入int類型變量的第字節,剩下的高位字節使用char類型變量的符號位擴展填充。所以,a變量的二進制是 1111 1111,其中符號位是1,那麼,放入int類型變量的時候,把a變量的 1111 1111 數據放入int類型變量的低字節,高字節使用符號位1擴展填充,最終是1111 1111 1111 1111 1111 1111 1111 1111二進制數值,表示為-1這個數值。

下面來講解一個應用實例,在網絡通信或者串口通信的過程中,傳輸的數據是一個一個字節的數據流。例如,一個字節的數據是128(十六進制是0x80),對應是二進制是1000 0000,那麼,就應該把這個數據當作“無符號”數看待,這樣,一個字節中的8位數據才完全做為數值位,才表示128這個數值。

如果把128這個數值作為“有符號”數看待,那麼,最高位作為符號位,剩下的7位作為數值位,那麼,128這個數值當作有符號數看待時,其數值就發生了改變。測試例子如下:

C語言的有符號數的符號位擴展,老司機都滑到

程序運行結果如下:

C語言的有符號數的符號位擴展,老司機都滑到

可以看到,char類型是“有符號數”類型,那麼,存儲在char類型變量x中的數據當作“有符號數”看待。所以,128數值存儲在1個字節中的二進制是1000 0000,當以十六進制輸出%x的時候,默認輸出4個字節的寬度,所以,1000 0000中的符號位向高位擴展,擴展到4個字節的空間。所以,得到4個字節中的二進制數據是:1111 1111 1111 1111 1111 1111 1000 000,表示是十六進制就是0xffffff80;

在第二行輸出中,對變量x的輸出,強制轉換為無符號類型,那麼,就把變量x當作無符號數看待,就輸出其數值0x80。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/255688.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-15 12:28
下一篇 2024-12-15 12:29

相關推薦

發表回復

登錄後才能評論