2013-02-26 74 views
3

C是否定義整數的二進制表示形式,例如one's,two's complement ...或者這是 表示處理器(計算機或其他)的依賴關係嗎?計算機中的整數表示 - C

的Exmple C語言編寫的代碼:

short a = -5; 

在哪裏,我需要看就知道wheter a是補1111 1111 1111 1011或 籤位表示1000 0000 0000 0101

+0

不依賴於處理器,該表示與語言實現相關。 – sgarizvi 2013-02-26 11:15:22

+4

99.9999%這是兩個補碼。您可以使用格式將值顯示爲十六進制(使用printf或sprintf使用%X)。 – m0skit0 2013-02-26 11:17:41

回答

6

C支持以下三種表示有符號整數:

  • 2的補數(最常見的,你是相當不可能看到在實踐等)
  • 1的補
  • 標誌 - 和 - 量級

C還允許在表示中存在一些填充(非值)位,這在實踐中也是非常罕見的。

C沒有定義整數是否應該作爲大端或小端或其他字節順序存儲在內存中。

如果您想了解在特定平臺上如何表示整數,您需要分析底層內存。另外,如果-INT_MAX == INT_MIN + 1,你有2的補碼錶示,否則它是不確定的,它是三個中的哪一個。

我認爲現在假設沒有填充位並且表示是2的補碼是安全的。

+0

我會對此進行投票,但如果根據6.5p5,「INT_MAX == 32768」和「INT_MIN == -32767」,則「-INT_MAX」可能是未定義的行爲。 – Sebivor 2013-02-26 11:30:03

+0

@modifiablelvalue那('INT_MAX = 32768')沒有什麼意義(儘管如此,'INT_MIN = -32767'確實可以)。 – 2013-02-26 11:33:26

+0

也許更好的測試是:'unsigned int x = INT_MIN; x + = INT_MAX;如果(x!= 0){/ *二進制補碼* /}' – Sebivor 2013-02-26 11:37:57

4

整數的表示是平臺(處理器)相關的。請參閱Endianness

5

它依賴於平臺,與little/big Endian相同。 某些類型的號碼大小也取決於平臺。

3

整數的二進制表示是平臺相關的,如果平臺遵循little endian,則整數然後-ve no被存儲爲2的補碼。

a= -5; 
b = 5; 
printf("%d %d", a, b); 
printf("\n%u %u", a, b); 

將顯示,

-5 5 
4294967291 5 
2

符號短-5是0xFFFB。符號+絕對值表示沒有意義。 加法和減法不關心有符號/無符號類型。如果你添加0xFFFB和0x0005,你會得到0x0000。如果你嘗試0x8005 + 0x0005,你會得到0x800A,這將根據你的假設-10這是無稽之談。這個數字是二進制補碼,但是對於短數字,它只是-x = 2^16 - x(mod 2^16)。

+0

'簽名的短-5是0xFFFB',這是不是由C標準保證。 – 2013-02-26 11:37:14

+0

標準確實沒有提到二進制表示。這意味着,對主要問題的回答是「否」,但除了通常的數字表示將是完全愚蠢的。請給出一些這樣(或其他)愚蠢的數字表示的例子。 – 2013-02-26 11:51:25

+0

[Wikipedia](http://en.wikipedia.org/wiki/Signed_number_representations) – 2013-02-26 11:52:57