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-tw/n/255688.html

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

相關推薦

發表回復

登錄後才能評論