2015-11-13 70 views
4

任何int數據類型(不包括tinyint)的上限始終小於下限的絕對值。爲什麼有一個比正整數更多的負整數?

例如,int的上限是2,147,483,647,ABS(下限)= 2,147,483,648。

是否有一個原因,爲什麼總是會有一個負int比正int?

編輯:既然問題改變的是沒有直接關係的DB的

+9

因爲0沒有'+0和-0'。 2^32是偶數。你有一個0,所以你有2^31-1這是奇怪的。你不能走負面和相同的長度 – lad2025

+2

https://en.m.wikipedia.org/wiki/Two%27s_complement –

回答

4

您提供的是符號整數類型。我們來看一個字節(8位)的例子。用1個字節你有2^8組合,它給你256個可能的數字來存儲。

現在你想要有相同數量的正數和負數(每組應該有128個)。

要點是0沒有+0-0。只有一個0

所以你最後的範圍是-128..-1..0..1..127

相同的邏輯適用於16/32/64-bit

編輯:

爲什麼範圍-128 to 127

這取決於你如何represent signed integer

+3

這並不完全解釋爲什麼範圍不是-127 - 128. –

+1

謝謝lad2025,在閱讀完補語 –

2

這個問題是不是真的涉及到數據庫。

正如lad2025指出的那樣,存在偶數個值。所以,通過包含0,就會有一個正值或負值。你所問的問題似乎是:「爲什麼有一個比正值更多的負值?」

基本上,原因是符號位。負數的一種可能的實現方式是使用n-1位作爲絕對值,然後使用0和1作爲符號位。這種方法的問題是它允許+0和-0。這是不可取的。

爲了解決這個問題,計算機科學家設計了帶符號整數的二進制補碼錶示法。 (Wikipedia explains this in more detail。)基本上,這種表示保持了可以測試的符號位的概念。但它改變了表示。如果+1表示爲001,那麼-1表示爲111.也就是說,負值是正值減一的按位補碼。實際上,負總是通過減1和使用逐位補碼產生的。

問題是值100(後面跟着任意數量的零)。符號位被設置,所以它是負的。但是,當你減1並反轉時,它又變成了自己(011-> 100)。有一種說法叫做「無限」或「不是數字」。相反,它被分配最小的可能的負數。

+0

後,我明白了原因。感謝Gordon的幫助,我在閱讀Wiki後瞭解它。我認爲你的意思是-1表示爲111,二進制補碼0全爲0,這就是爲什麼有一個負值比正值多一個原因。再次感謝! –

+0

@MarkHe。 。 。非常感謝你。我從記憶中寫下了原文,自從那些計算機科學課程以來,這已經有一段時間了。我確定了答案。 –

相關問題