unsigned int與int相加問題

2021-09-09 01:43:38 字數 1440 閱讀 9924

作者 : 卿篤軍

一道unsigned int與int型別的相加題目。引發了我對這個問題的思考。

首先要明確兩個問題:

問題一、

unsigned intint究竟哪個能表達出來的數上限大呢?

答:當然是unsigned int

為什麼?

答:由於。int將最高位看做是符號位。0表示'正',1表示'負'。也就是說,最高位不能用來存值。

問題二、

當計算機進行兩數相加的時候會怎樣進行型別轉換呢?

答:當然是將上限小的轉化為上限大的咯。(就是將int型別轉化為unsigned int型別)。

為什麼?

答:我們知道int + double 會所有轉化為double型相加。而計算機在進行兩數相加的時候,為了避免資料溢位,就轉化為上限較大的型別進行操作了~~~

以下,我們以32位機上面的加法進行分析:

演示樣例:

unsigned int a = 0;

int b = -1;

a + b = ?

第一步:將int b  = -1;轉化為unsigned int 型別,就是將最高位的符號位1看成是存放的值。

那麼-1在記憶體中是怎樣存放的呢?

答:-1就是,1取反然後—+1;

32位機,就是4*8 = 32(8個位元組,每乙個位元組佔4位);

1        2        3        4      5       6          7        8

1的二進位制原碼:0000 0000 0000 0000 0000 0000 0000 0001

1的二進位製取反:1111 1111 1111 1111 1111 1111 1111 1110

1二進位製取反+1:1111 1111 1111 1111 1111 1111 1111 1111這就是-1在記憶體中的存放形式

而1111 1111 1111 1111 1111 1111 1111 1111(二進位制)   =  4294967295(十進位制)

第二步:執行a+b操作

所以,上面的問題就轉化為了 4294967295 + 0 = ?

非常顯然結果就是:4294967295

附上c語言**:

參考文獻:隨心的,unsigned與int相加的問題,

int 與 unsigned int 移位運算

今天看到個別人提的問題,不懂便查了點資料解決了 可能很簡單,但之前確實不清楚 問題如下 執行結果是什麼?結果為 fffffff4 f8 思路為 開始想著這肯定跟型別範圍有關,int 為 2的31次方 到 2的31次方減1,unsigned int 為0 到 2的32次方。後來想到 int是帶符號型別...

C語言之unsigned int和int的運算

首先先說明下 1 數值在計算機中是以補碼的形式儲存的。同時如果兩個補碼相加時,最高位也就是我們的符號位如果有進製,是需要丟棄的。正數的補碼是自己本身,負數的補碼是符號位為1,其餘位為該數絕對值的原碼按位取反,然後整個數再加1.2 如果乙個運算子兩邊的運算數型別不同,先要將其轉換為相同的型別,即較低型...

unsigned int型別分析

int main void 結果 a 1,b 128,c 127,d 1 aa 255,bb 0,cc 1 你看下unsigned char 值從0 255 char就是int char值從 127 128 在0 128 不管unsigned char 還是char的值都要一樣的 是的沒錯 char...