原碼 反碼 補碼

2021-08-28 21:33:25 字數 1228 閱讀 4630

原碼

如果機器字長為n,那麼乙個數的原碼就是用乙個n位的二進位制數,其中最高位為符號位:正數為0,負數為1。剩下的n-1位表示該數的絕對值。

x=+101011 , [x]原= 0010 1011

x=-101011 , [x]原= 1010 1011

反碼反碼就是在原碼的基礎上,符號位不變其他位按位取反。

x=-101011

[x]原= 1010 1011

[x]反=1101 0100

補碼在反碼的基礎上按照正常的加法運算加1。

x=-101011

[x]原= 1010 1011

[x]反=1101 0100

[x]補=1101 0101

習題如果有signed char c=0,對其自增128次後,賦值給乙個int變數,問int變數的值是多少?

signed

char c =0;

c +=

128;

int val = c;

std::cout <<

"val: "

<< val << std::endl;

signed char的範圍是-128~127. 首先看127的補碼:

0111 1111

加一後得到,1000 0000

賦值給int後符號位保持不變,(這裡假設int為16位)得到1111 1111 1000 0000.

將其復原為原碼:

減一得到:1111 1111 0111 1111

非符號位取反:1000 0000 1000 0000

這時候我們再讀數值,表示的是-128.

float和double精度

float:

1bit(符號位)

8bits(指數字)

23bits(尾數字)

double:

1bit(符號位)

11bits(指數字)

52bits(尾數字)

精度float和double的精度是由尾數的位數來決定的。浮點數在記憶體中是按科學計數法來儲存的,其整數部分始終是乙個隱含著的「1」,由於它是不變的,故不能對精度造成影響。

float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字;

double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...

原碼 反碼 補碼

數值在計算機中表示形式為機器數 計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的 是十進位制,正如亞里斯多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手 指頭這個解剖學事實的結果.儘管在歷史上手指計數 5,10進製 的實踐要比二或三進製計數出現的晚.摘...