2012-11-04 82 views
2

在大多數編程語言中,整數數據類型的有限範圍內總是會有一個負數比正數大。數字原始數據類型

例如,在C中,一個字節是-128〜127,int是-2^31和2^31-1之間的整數。 有沒有原因爲什麼一個字節不是-127〜128,因爲在直觀意義上,正數的出現更頻繁?

+0

請注意,有多少*非負*整數是負數。不要忘記0! – delnan

回答

3

最大的正時0111 1111 = 127

128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | 
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 

最大負字節是1000 0000 = - 128

-128| 64 | 32 | 16 | 8 | 4 | 2 | 1 | 
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 

在二進制的MSB(最高有效位 - 前一個)是保留以表示負數。這個概念被稱爲Twos' Complement,被大多數計算機用作以二進制(基數2)表示法表示整數的一種方式。

爲了獲得更多的信息查找到二進制計算

+1

+1關鍵字:二進制補碼。 – delnan

+0

@delnan謝謝!加了一點:) –

+1

@delnam - 我不記得了,C標準是否需要兩個人的讚美,還是僅僅是最常見的?不是任何人實際上*使用*的讚美了。 –

0

這是因爲2的補碼錶示法。符號位爲0表示正數,1表示負數。因此,使用4位作爲一個簡單的例子:

陽性:0爲0000,1是0001,等等,直到作爲0111 7.

陰性:-1是1111,-2是1110,等等,降至1000爲-8。

0

(我知道這並不能回答你的問題,但它確實解決你的問題一個不真實的假設,這是太長留下的評論。)

事實上,C標準不定義一個字節的大小。

唯一確定的是char將能夠保存一個字符。

過去,取決於CPU,字節的取值範圍爲5到9位。

確實,大部分野性已經穩定下來,大部分系統都使用8位字節。

// What the C standard says must be true: 
sizeof char <= sizeof int <= sizeof long 

這就是爲什麼許多預C99(和C99)系統包含的非常有用的typedef:

int8 
uint8 
int16 
uint16 
int32 
uint32 
+0

如果我們要迂腐:(1)但是,C標準確實爲您列出的類型定義了*最小*範圍。 (2)固定大小的整數類型*已經在C99中被標準化,稍後將被標準化。 (3)也有(非古代)嵌入式系統的報告,其中「字節」是幾個八位字節大。 – delnan

+0

@delnan - 感謝那裏的負責人。到C99開始流行時,我已經沒有大部分的C開發了。就迂腐而言,罪名成立。在我的辯護中,C是一種迂腐的語言。已知C開發人員最終在低層領域工作,因此應該更加小心「一刀切」的思維模式。 –

0

在整體的數據類型具有有限的範圍內大多數編程語言,總是有負數比正數多一個。

這是因爲2的補碼幾乎總是被使用。

二補的原因如此受歡迎基本上歸結爲硬件原因。特別是:

a - b = a + (~b + 1)

例(4位字):

0110 - 0101 = 0110 + 1010 + 1 = 0110 + 1011 = 0001(注意,除了步驟基本上無符號的另外 - 有符號位的任何特殊處理這些步驟)

基本上,在hardware-land中,您可以將a - b更改爲a + ~b + 1,並將初始進位設置爲1.這可能是一個非常有用的技巧。減法不需要特別小心,這意味着它不需要自己的電路。