原碼
原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值. 比如如果是8位二進位制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符號位. 因為第一位是符號位, 所以8位二進位制數的取值範圍就是:
[1111 1111 , 0111 1111]
即[-127 , 127]
原碼是人腦最容易理解和計算的表示方式.反碼
反碼的表示方法是:
正數的反碼是其本身
負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可見如果乙個反碼表示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算.補碼
補碼的表示方法是:
正數的補碼就是其本身
負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
對於負數, 補碼表示方式也是人腦無法直**出其數值的. 通常也需要轉換成原碼在計算其數值.
負數採用補碼編碼:例如char t=-2,
原碼是1010,則反碼是:1101,補碼是:1110,即-2的機器表示為1110;
因為c語言中規定同級別的無符號數的精度高於有符號數,所以會隱式地將:有符號數轉為無符號數(底層位級表示不變,只是解讀方式不同)。
#include
#include
void main()
a:-1
b:4294967295
c:0x7fffffff
d:0xffffffff
正確答案為:ab
解析:
無符號和有符號整數進行運算時,有符號整數會被提公升為無符號整數。
-3對應的二進位制表示是0xfffffffd,和2相加表示0xffffffff。
輸出結果取決於long是32位,還是64位。這個取決於編譯器和機器。
long是有符號的整型。
如果是32位,0xfffffff在補碼表示法(最高位是負數字)下是等於-1.
如果是64位,0xfffffff是屬於long的正整數範圍(負數字在第64位),等於4294967295。
(如果你的編譯出來是32位的long,你可以用longlong測試一下就能得到這個數。因為 long long 無論在32位機器或者64位機器都是占用8個位元組64位)
原碼,反碼,補碼,有符號數和無符號數
請先看以下博文 原碼,反碼,補碼 詳解 c語言系列 二 有符號數和無符號數詳解 有符號數,無符號數 對於乙個二進位制數,它可以是有符號數,也可以是無符號數,具體是哪個,由 決定。比如 1000 0001無符號數 當前二進位制的大小,即1000 0001表示129 有符號數 將最左邊一位做為符號位,剩...
無符號數 有符號數 與 補碼
本文是深入理解計算機系統這本書裡面關於補碼有符號數無符號數章節的乙個摘要和讀書報告,我個人認為這本書關於這一段的表述,要比絕大多數網上的部落格甚至是國內教材要深入淺出的多.同時由於markdown的文件表示公式很麻煩,本文將大量使用書中的截圖作為公式使用.書中採用乙個函式b2u w binary t...
有符號數的原碼 反碼 補碼詳解
有符號數 signed d 符號位 數值位 例如 int i 7 int 型別佔4個位元組,1個位元組佔8個位,int佔32個位元位 7 根據8421碼得到二進位制原碼 0b00000000000000000000000000000111 int 型別的表數範圍 計算機中儲存有符號數的時候是按照補碼...