- 原碼
原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值. 比如如果是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<stdio.h> #include<stdlib.h> void main() { int a = -3; unsigned int b = 2; long c = a + b; printf("%ld\n",c); } 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位)
