作者 : 卿篤軍
一道unsigned int與int型別的相加題目。引發了我對這個問題的思考。
首先要明確兩個問題:
問題一、
unsigned int和int究竟哪個能表達出來的數上限大呢?
答:當然是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...