在大多數編程語言中,整數數據類型的有限範圍內總是會有一個負數比正數大。數字原始數據類型
例如,在C中,一個字節是-128〜127,int是-2^31和2^31-1之間的整數。 有沒有原因爲什麼一個字節不是-127〜128,因爲在直觀意義上,正數的出現更頻繁?
在大多數編程語言中,整數數據類型的有限範圍內總是會有一個負數比正數大。數字原始數據類型
例如,在C中,一個字節是-128〜127,int是-2^31和2^31-1之間的整數。 有沒有原因爲什麼一個字節不是-127〜128,因爲在直觀意義上,正數的出現更頻繁?
最大的正時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關鍵字:二進制補碼。 – delnan
@delnan謝謝!加了一點:) –
@delnam - 我不記得了,C標準是否需要兩個人的讚美,還是僅僅是最常見的?不是任何人實際上*使用*的讚美了。 –
這是因爲2的補碼錶示法。符號位爲0表示正數,1表示負數。因此,使用4位作爲一個簡單的例子:
陽性:0爲0000,1是0001,等等,直到作爲0111 7.
陰性:-1是1111,-2是1110,等等,降至1000爲-8。
(我知道這並不能回答你的問題,但它確實解決你的問題一個不真實的假設,這是太長留下的評論。)
事實上,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
如果我們要迂腐:(1)但是,C標準確實爲您列出的類型定義了*最小*範圍。 (2)固定大小的整數類型*已經在C99中被標準化,稍後將被標準化。 (3)也有(非古代)嵌入式系統的報告,其中「字節」是幾個八位字節大。 – delnan
@delnan - 感謝那裏的負責人。到C99開始流行時,我已經沒有大部分的C開發了。就迂腐而言,罪名成立。在我的辯護中,C是一種迂腐的語言。已知C開發人員最終在低層領域工作,因此應該更加小心「一刀切」的思維模式。 –
在整體的數據類型具有有限的範圍內大多數編程語言,總是有負數比正數多一個。
這是因爲2的補碼幾乎總是被使用。
二補的原因如此受歡迎基本上歸結爲硬件原因。特別是:
a - b = a + (~b + 1)
例(4位字):
0110 - 0101 = 0110 + 1010 + 1 = 0110 + 1011 = 0001
(注意,除了步驟基本上無符號的另外 - 有符號位的任何特殊處理這些步驟)
基本上,在hardware-land中,您可以將a - b
更改爲a + ~b + 1
,並將初始進位設置爲1.這可能是一個非常有用的技巧。減法不需要特別小心,這意味着它不需要自己的電路。
請注意,有多少*非負*整數是負數。不要忘記0! – delnan