有符號數的符號位擴充套件

2021-09-17 22:07:59 字數 1546 閱讀 9696

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

我們會很直觀地認為,把1個位元組大小的資料,放入4個位元組大小的容量,沒有任何問題啊!我們做如下的乙個測試例子:

#include

//包含標頭檔案

, 為了使用

printf()函式;

intmain()                          

//定義程式的主函式

, 就是程式的入口位址;

//主函式的結束標記;

程式執行結果如下:

mylinux@ubuntu:~/src/test$ gcc test.c -o exe

mylinux@ubuntu:~/src/test$ ./exe

a = -1, b = -1

可以看到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這個數值當作有符號數看待時,其數值就發生了改變。測試例子如下:

#include

//包含標頭檔案

, 為了使用

printf()函式;

intmain()                          

//定義程式的主函式

, 就是程式的入口位址;

//主函式的結束標記;

程式執行結果如下:

mylinux@ubuntu:~/src/test$ gcc test.c -o exe

mylinux@ubuntu:~/src/test$ ./exe

x = ffffff80

x = 80

可以看到,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。

C 有符號數和無符號數擴充套件

c語言標準要求先進行資料大小的轉換,之後再進行無符號和有符號之間的轉換.c語言中的強制型別轉換保持二進位制位值不變,只是改變解釋位的方式。將無符號數轉換為更大的資料型別時,只需簡單地在開頭新增0,這種運算稱為0擴充套件。將有符號數轉換為更大的資料型別需要執行符號擴充套件,規則是將符號位擴充套件至所需...

有符號數與無符號數

關於有符號數和無符號數的一些重要知識點,包括它們在記憶體中的儲存方式 互相轉換 越界計算等。大家肯定都知道,對於有符號數,資料型別的最高位用於標示資料的符號,最高位為1表示負數,最高位為0表示正數,那麼今天我們主要就此討論乙個問題 在計算機內部具體是如何表示有符號數呢?在計算機內部是通過補碼的方式來...

有符號數和無符號數

有符號和無符號整數 1.通常情況下,大多數字預設的是有符號數,比如 4,5 要想寫乙個無符號數必須在後面加u 比如 4u,5u 2.在計算機中有符號數是用補碼的形式來表示的,最高位是符號位。無符號數就是正數唄 正數的補碼和原碼相同。比如 1 在計算機中表示為 11111111 11111111 11...