2016-03-01 83 views
-1

這個問題可能是很基本的,但只有在使用Google的天,在C.符號int範圍混亂

符號整數的我應有基本的瞭解

其實有些人說有符號整數的範圍有我在這裏發佈

  1. -32767〜32767和其他人說,它具有範圍
  2. -32768至32767

讓我們INT A = 5(簽字/讓我們只考慮1個字節)

* a = 5的第一個表示形式表示爲00000101爲正數,並且a = -5表示爲10000101(因此範圍-32767至32767表示對齊) (此處的msb /符號位爲1/0該數字將是正/負,並且其餘的(幅度位)不變)

* a = 5的第二表示被表示爲00000101作爲正數並且a = -5被表示爲11111011 (msb是視爲-128,其餘的位被操縱以獲得-5)(因此範圍-32768到32767對齊)

所以我混淆了這兩個東西。我的疑問是什麼,是在C符號整數的實際範圍,1),2)

+0

您已經回答了您的問題。你在問什麼?也許你想搜索「有符號整數的表示」。還要注意這兩個假設實際上並不是完整的事實。 – Olaf

+0

C中的int沒有固定的指定大小。只有最小值被定義。在2的補碼中,一個n比特類型的範圍從'-2 ^(n-1)到'2 ^(n-1)-1' –

+2

它依賴於底層平臺,如果它使用[補碼] ://en.wikipedia.org/wiki/Ones'_complement)或[two's complement](https://en.wikipedia.org/wiki/Two's_complement)(二進制補碼是常用補碼)。至於位的大小,它也取決於,而這些天'int'通常是32位。 –

回答

3

這取決於你的環境,通常int可以存儲-2147483648到2147483647如果是32位長,補碼時,但C規範說int可以存儲至少 -32767〜32767

從整數類型的N1256 5.2.4.2.1規格報價< limits.h中>

他們實現定義的值應相等或gr以相同的符號在所示的那些的量級(絕對值)上消費。

- int類型的一個目的
INT_MIN最小值-32767 // - (2- - 1)
- int類型的一個目的最大值
INT_MAX 32767 // 2 - 1`

3

今天,已簽名的整數通常在two's complement notation中完成。

最高位是「符號位」,它是爲所有負數設置的。

這意味着您有七位來表示不同的值。

未設置的最高位可以(總共16位)表示值0..32767。

隨着最高位設置,並,因爲你已經有一個表示零,你可以代表值-1 ..- 32768。

然而,這是實現定義的,其他表示也存在。爲你的平臺上/有符號整數你的編譯器的實際範圍限制在您的環境<limits.h>發現的。那是只有明確權限。

在今天的桌面系統上,int通常是32位或64位寬,相對於您所談論的16位32767/32768的範圍相應更大。因此,無論這些人都在談論真的老了平臺,真的老了知識,嵌入式系統,或最低保證範圍 - 標準的規定,INT_MIN必須至少 -32767,並INT_MAX至少 +32767,最小公分母。

+0

如果帶符號的位通常以二進制補碼形式完成,那麼顯然-32768至32767必須是正確的範圍?那麼它們的含義至少爲-32767至至少32767 – adi

+1

100s 2015年有數百萬處理器由8位和16位寄存器構成,用於編程這些嵌入式處理器的編譯器使用16位「int」。 C在那裏很受歡迎。幾乎沒有舊的平臺。 – chux

+0

@adi:標準不能保證二進制補碼符號(正如我寫的,其他符號存在)。該標準也沒有指定int類型的16位寬度(很明顯)。所以所有的標準*保證*正是我寫的:'INT_MIN'必須*至少* -32767,'INT_MAX'至少* * 32767。我不知道一個系統將這兩個常量定義爲*這些值,它們只是*保證的最小值*。 – DevSolar

0

32767是,你可以在16位有符號整數,代表最大正值。 C對應的類型是short

int類型至少表示與short相同的字節數,最多與long相同的字節數表示。在16位處理器上的int的大小是2個字節(與short相同)。在32位和更高的結構,的int的大小爲4個字節(同long)。

無論架構如何,int的最小值爲INT_MIN,最大值爲intINT_MAX

類似,也有常數以獲取shortSHRT_MINSHRT_MAX),longchar等使用硬編碼的常量或猜測是int的最小值你不需要的最小值和最大值的系統。


的表示#1被命名爲"sign and magnitude representation"。這是一個理論模型,它使用最重要的字節來存儲符號,其餘的字節存儲數字的絕對值。它被一些早期的計算機使用,可能是因爲它似乎是數學中數字表示的自然映射。但是,對於二進制計算機來說這並不自然。

的表示#2被命名爲two's complement。二進制補碼系統具有的優點是加法,減法,和乘法的基本算術運算是相同的那些無符號二進制數(只要輸入在相同數目的比特的和超出那些位中的任何溢出表示被丟棄從結果)。這就是爲什麼它是現在的首選編碼。

0

C標準規定了整數值的最低限度。因爲它是寫在標準(整數類型5.2.4.2.1大小)

  1. ...其實現定義的值應等於或大於 的大小(絕對值)與所示的符號相同。

對於類型int這些最低限值是對象

- int類型的一個目的最小值

INT_MIN -32767 // −(215 − 1) 

- int類型的一個目的最大值

INT_MAX +32767 // 215 − 1 

對於整數的二進制補碼錶示■正值的數量比負值的數量少1。因此,如果只有兩個字節用於表示類型爲int的對象,則INT_MIN將等於-32768

考慮到32768的數量級大於標準中使用的值。所以它符合標準要求。

另一方面HABD爲表示「符號和幅度」的限制(當使用2個字節)將是相同的如圖所示的標準即-32767:32767

所以在實現中使用的實際極限取決於整數的寬度及其表示。

1

我的疑問是c中的signed int的實際範圍是什麼,1)[-32767 to 32767]或2)[-32768 to 32767]

C和高便攜性,以新老平臺的它的優勢的整點是代碼不應該關心

C定義了帶有2個宏的int的範圍:INT_MININT_MAX。 C規格指定:
INT_MIN是-32,767 或更少
INT_MAX是+32,767 或更多

如果代碼需要16位二進制補碼類型,請使用int16_t。如果代碼需要32位或更寬的類型,請使用longint32least_t等。不要假定int是沒有定義的代碼。

+0

感謝你的迴應。當代碼需要2的補碼和符號/幅度表示? – adi

+0

@adi 1)當代碼需要2的補碼時,使用精確的寬度類型,比如'uint8_t','int64_t'等。2)如果代碼需要_sign/magnitude representation_, - 無法幫到你。 3)但最重要的是,避免編碼需要特定底層表示的地方。 4)使用各個位時,使用無符號類型。 – chux

+0

是依賴於數據類型範圍的編譯器還是計算機體系結構? – adi