關於操作有符號數的溢位問題

2021-06-23 04:02:08 字數 1026 閱讀 4920

在計算機中,數值的二進位制表示方法主要有:原碼、反碼和補碼。通常取最高位為符號位,0表示正數,1表示負數。正數的原碼、反碼、補碼一樣。而負數的原碼最高位取1,數值位取負數絕對值的二進位制值;反碼的符號位為1,其餘位取反;補碼的符號位為1,其餘位取反加1。

在32位計算機中,有符號字元型變數的取值範圍是-27 ~ 27-1,有符號整型變數的取值範圍是-215~ 215-1,如果將有符號整型變數賦給有符號字元型變數,則高位被截斷,保留低八位。

看乙個例子:

#include#includeint main()

printf("%d\n", strlen(a));

return 0;

}

語句a[i] = -1 – i ;將有符號整型變數賦給有符號字元型變數,當0 <= i <=127時,不會溢位,a[i]從-1變到-128,當i = 128時,- 1 - i = -129。-129的原碼形式是:

1000 0000 0000 0000 0000 00001000 0001;補碼形式是

1111 1111 1111 1111 1111 11110111 1111;此時將其賦給signed char型別的a[128]時,發生溢位,只保留低八位0111 1111,即127。之後隨著i的增加,a[i]從127逐漸向0靠近,當i = 254時,-1 – i =-255,補碼表示是:1111 1111 1111 1111 1111 1111 0000 0001,此時a[254] = 1。當i = 255時,a[255] = 0,即將ascii碼為0的值賦給字元型陣列元素a[255]。隨後a[i]又是從-1 ~ -128,再從127 ~ 0之間反覆變化。

而strlen函式是求取字串的實際長度,當遇到第乙個空字元』\0』時,返回,所以strlen(a) = 255。

ps:空字元』\0』(ascii碼值為0)、零字元』0』(ascii碼值為48)。

2023年8月10日星期日

有符號數溢位的判斷

對於兩個w位寬的有符號整數來說,其能夠表示的範圍在 2的w 1次方到2的w次方 1之間。因此有兩種情況能夠使兩個數相加溢位。1 同符號數相加 2 異符號數相減 如果溢位,那麼相加的結果超過了能夠表示的範圍,則有可能出現兩個正數相加得到乙個負數,所以相加的結果小於兩個加數。或兩個負數相加得到乙個正數,...

有符號和無符號整型資料溢位問題

無符號數都有 unsigned 標誌,如果沒有 unsigned 標誌,則程式預設該數為有符號數 signed 無符號數可正可負 有符號數一定為正。由於有符號與無符號數所占用的位元組數相同,因此無符號數所允許的最大值比有符號數的大一倍。如 無符號短整型數的數值範圍是0到65535,而有符號短整型數的...

無符號數與有符號數的操作

void sum void 當混合不同型別的變數進行計算時,便可能會發生型別轉換 相同型別的資料在轉換時有規則可循 字元必須先轉換為整數 c語言規定字元型別資料和整型資料之間可以通用 short型轉換為int型 同屬於整型 float型資料在運算時一律轉換為雙精度 double 型,以提高運算精度 ...