有符號數和無符號數混用的思考

2021-09-27 09:49:24 字數 3176 閱讀 8890

參考文章:

[1] c語言中無符號數和有符號數之間的運算

[2] 負數在計算機中怎樣儲存

[3] 二進位制減法

原碼:10進製轉換成2進製是原碼,只不過正數的原碼是本身符號位為0,負數的原碼符號位為1(以下篇幅均以單位元組為例:10進製1的原碼是0000 0001,10進製-1的原碼是1000 0001)。

反碼:正數的反碼是本身,負數的反碼是負數的原碼0變為1,1變為0   (-1的原碼是1000 0001   它的反碼就是 1111 1110,)。(注意負數求反碼時候的符號位不參與變換)。

補碼:正數的補碼是本身,負數的反碼就是負數的反碼加一(-1的原碼是1000 0001   它的反碼就是 1111 1110  它的補碼就是 1111 1111)。

總結:正數的原碼,反碼 ,補碼三值合一, 負數的原碼,反碼,補碼不同。

為什麼要引入反碼、補碼?

總結:計算機中正數和負數都是以補碼的形式存在的,方便做減法(只不過正數的補碼是本身)。

當表示式中存在有符號數和無符號數時,計算結果會視為無符號數。

unsigned u = 10, u2 = 42;

std:cout << u2 - u << std:endl;

std:cout << u - u2 << std:endl;

輸出結果:32    4294967264u在計算機中的儲存:00000000 00000000 00000000 00001010(補碼)

u2在計算機中的儲存:00000000 00000000 00000000 00101010(補碼)

當表示式中存在有符號數和無符號數時,計算結果會視為無符號數。

#include "iostream"

using namespace std;

int main()

輸出結果:4294967295

11111111 11111111 11111111 11110000 (-16補碼)

+ 00000000 00000000 00000000 00001111 (15補碼)

11111111 11111111 11111111 11111111 (視為無符號數就是4294967295)

注意:這段**如果寫成c形式,輸出需要寫成如下形式,不然%d指的是有符號數。

printf("%u\n",c + d);
#include using namespace std;

int main()

return 0;

}

輸出結果:其實這個很好理解,把 if (a > b) 轉換為 if(a - b > 0),現在根據3所述,a - b是大於0的。

11111111 11111111 11111111 11111111 (-1的補碼)

- 00000000 00000000 00000000 00010000 (16的補碼)

11111111 11111111 11111111 11101111 -> 計算結果視為無符號數,那就是4294967279

#include using namespace std;

int main()

return 0;

}

輸出:顯然結果與上面不一樣了,why?

c語言中比int小的整型(包括short 、unsigned short 、 unsigned char和char)在運算中,考慮到運算效率的問題都要轉換成int然後進行運算。

如果是unsigned的型別轉換成int型別,高位補0.

如果是signed的型別轉換成int型別,如果原來最高位是1則補1,如果是0則補0

char a = -1;

a -> 1111 1111 -> 補成int: 11111111 11111111 11111111 11111111

unsigned char b = 16;

b -> 0001 0000 -> 補成int: 00000000 00000000 00000000 00010000

11111111 11111111 11111111 11111111

- 00000000 00000000 00000000 00010000

11111111 11111111 11111111 11101111

對於unsigned short和short進行運算,和char和unsigned char一樣,都是要先轉換成int,然後再進行運算。轉換時高位補齊的方法也和unsigned char、char一樣。

有符號數和無符號數

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

無符號數和有符號數

人有十個手指頭,習慣了逢十進一,於是十進位製成了生活中的標準。程式的世界只有高低電平兩種狀態,更適合用二進位制來表示,於是二進位製成了程式世界的標準。對與無符號數來說,我們更喜歡談他們之間的轉化,十進位制是我們最習慣的進製,於是十進位制轉為r進製,r進製轉為十進位制變尤為重要。十進位制 r進製 整數...

有符號數和無符號數

刷題刷到了有符號數的問題,回顧一下知識點 有符號數 signed 可以區分正負數 最高位表示數值的正負 0表示正數,1表示負數 無符號數 unsigned 不區分正負數 只有整數型別 雖然無符號數所能表示的最大數值大於有符號數,但兩者所能表示的數值範圍相同。eg.short int 128,0 0,...