有符號數與無符號數

2021-07-09 18:08:32 字數 1459 閱讀 1448

關於有符號數和無符號數的一些重要知識點,包括它們在記憶體中的儲存方式、互相轉換、越界計算等。

大家肯定都知道,對於有符號數,資料型別的最高位用於標示資料的符號,最高位為1表示負數,最高位為0表示正數,那麼今天我們主要就此討論乙個問題:在計算機內部具體是如何表示有符號數呢?

在計算機內部是通過補碼的方式來表示有符號數的。

–正數的補碼為正數本身

–負數的補碼為負數的絕對值各位取反後再加1

舉幾個例子:

8位整數5的補碼:0000 0101

8位整數-7的補碼:1111 1001

|-7| ==> 7 ==> 0000 0111 ==> 1111 1000 ==> 1111 1001

16位整數20的補碼:0000 0000 0001 0100

16位整數-13的補碼:1111 1111 1111 0011

|-13| ==> 13 ==> 0000 0000 0000 1101 ==> 1111 1111 1111 0010

==> 1111 1111 1111 0011

在計算機內部用原碼表示無符號數。

對於固定長度的無符號數:

–max_value + 1 -> min_value

–min_value - 1 -> max_value

當有符號數和無符號數混用進行計算時,有符號數會被轉換成無符號數進行計算,計算結果為無符號數,這會導致與預期不符的結果。

由於無符號數總是大於等於0的,因此在迴圈中,若使用無符號數作為控制迴圈是否繼續進行的條件變數,要特別小心,避免造成無限迴圈和永遠無法進入迴圈的情況。

在筆試題中經常會遇到含有諸如signed char a = 224,signed cha b = -10000的題目,它通常以此給出一些選項,讓你判斷正誤,這類題的關鍵是正確計算越界的有符號數的正確值,為了節省時間,總結下快速計算的公式,原理就不說了,純粹是為了應試的東西。 

我們已經知道:

8位signed char的取值範圍為[-128,127];

32位int的取值範圍為[-2147483648, 2147483647];

假設值為a的資料其資料型別大小為b位:

(1) 若a為右越界,則實際值 = a - 2^b * n,n根據a的大小確定;

(2) 若a為左越界,則實際值 = a + 2^b * n,n根據a的大小確定;

以上面提到的signed char a = 224,signed cha b = -10000為例:

a > 127為右越界,其實際值 = 224 - 256 * 1 = -32;

b < -128為左越界,其實際值 = -10000 + 256 * 39 = -10000 + 9984 = -16。

無符號數與有符號數比較

2012 04 24 19 30 2555人閱讀收藏 舉報擴充套件 先出幾個題目,再解釋一下為什麼答案是那樣的。題目一 int a 1 unsigned int b 1 printf d a b 結果輸出 1 因為無符號數與有符號數比較時,要將有符號數轉化為無符號數,再來比較。a轉化為無符號數後就是...

無符號數與有符號數比較

1轉化為無符號數 65535 在計算機中負數是用補碼表示的,即反碼加1 正數直接用原碼表示 因為 1是負數就用補碼表示為 00000000 00000001 的反碼 11111111 11111110 1 即 11111111 11111111 轉換為十進位制數為65535 最高位為符號位不必考慮 ...

有符號數與無符號數運算

有符號數與無符號數之間運算問題,這個問題測試是否懂得c語言中的整數自動轉換原則,有些開發者懂得極少這些東西。當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號型別。因此,從這個意義上講,無符號數的運算優先順序要高於有符號數,這一點對於應當頻繁用到無符號資料型別的嵌入式系統來說是丰常...