關於原碼 反碼及補碼的一些總結

2021-10-03 06:52:04 字數 2109 閱讀 2357

大小端位元組序

小端:數字的低位存到記憶體的低位址上。

大端:數字的低位存到記憶體的高位址上。

大端位元組序符合平時直覺,一台機器大端還是小端,取決於cpu

int a = 0x11223344

低位址0x100

0x101

0x102

0x103

高位址低位址

4433

2211

小端低位址

1122

3344

大端原碼反碼與補碼

例如-10:

1000 0000 0000 0000 0000 0000 0000 1010 原碼

1111 1111 1111 1111 1111 1111 1111 0101反碼

1111 1111 1111 1111 1111 1111 1111 0110補碼(原碼取反再加一,得到補碼)

計算機採用補碼來儲存,肯定要比直接用原碼麻煩,付出這樣的代價是為了讓計算機的硬體 裝置實現起來更簡單,通過補碼的方式,能夠把二進位制的加減法統一成加法運算

例如:計算 0 - 1 => 0 + (-1)

1000 0000 0000 0000 0000 0000 0000 0001 -1的原碼

1111 1111 1111 1111 1111 1111 1111 1110 ,-1的反碼

1111 1111 1111 1111 1111 1111 1111 1111 , -1的補碼

計算 2-1 2+(-1)

1111 1111 1111 1111 1111 1111 1111 1111 ,-1的補碼

1000 0000 0000 0000 0000 0000 0000 0010 ,2的補碼(正數的原碼反碼補碼都一樣)

「對於負數來說,需要把原碼轉成補碼在儲存,也需要用到補碼轉原碼」

「原碼轉補碼是 取反+1」

「補碼轉原碼還是 取反+1」

關於char型別的一些問題

char 乙個位元組的變數,當按照%d列印的時候,就會把char隱式轉換成int型別的變數,再列印

1000 0001 -1的原碼

1111 1110 -1的反碼

1111 1111 -1的補碼

%d列印的時候就先將a先隱式轉換成int

這個轉換過程中,高位的三個位元組也要填充,按照符號為來填充(如果a的符號位是0,高位就補0;反之補1)

此時char => int

1111 1111 => 1111 1111 1111 1111 1111 1111 1111 1111 => -1的補碼

高位補1也就是為了防止出現這樣轉換過程**現資料錯誤的情況

1111 1111 -1在記憶體中的儲存 unsigned char 存的還是八個1,此時最高位的1 不再是符號位了,八個1理解成正數(不考慮符號位)的結果就是255,%d列印時,1111 1111 => 高位補0(unsigned char沒有符號位)

0000 0000 0000 0000 0000 0000 1111 1111

char的範圍:-128 => +127

128 轉化成二進位制

1000 0000 0000 0000 0000 0000 1000 0000 -128原碼

1111 1111 1111 1111 1111 1111 0111 1111 -128反碼

1111 1111 1111 1111 1111 1111 1000 0000 -128補碼

char a = -128

1000 0000

?1111 1111 1111 1111 1111 1111 1000 0000(int)

?1111 1111 1111 1111 1111 1111 1000 0000(unsigned int)

此時最高位不再是符號位,不再表示負數,被理解成了乙個很大的數字

128 記憶體中的二進位制表示方式

0000 0000 0000 0000 0000 0000 1000 0000 (int)

char a =128;

1000 0000

發生了截斷

導致唯一的乙個1陰差陽錯的成了符號位,此時a的本質上是-128

關於原碼反碼及補碼

首先,在有符號數中,正數的原始碼,反碼和補碼都是相同的,首位為符號位 正數為0 後面的以二進位制數值表示其數值。接下來看負數 在原始碼中,負數也類似於正數的表示,不過符號位變為了1 原始碼表示負數是最簡單的也是最容易理解的,符號位表示正負號,其餘位轉化為二進位制即可。但是原始碼存在許多缺陷,比如0的...

原碼 反碼 補碼的總結

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

128的補碼及原碼 反碼 補碼

乙個位元組佔8位 乙個字長為n的機器數能表示不同的數字的個數是固定的2 n個,n 8時2 n 256 用來表示有符號數,數的範圍就是 2 n 1 2 n 1 1,n 8時,這個範圍就是 128 127。用來表示無符號數,就不需要用一位來表示符號位,n位機器數全部用來表示是數值,這時表示數的範圍就是0...