2013-03-11 144 views
6

開放組基本規格版本7,IEEE標準1003.1-2008:爲什麼signbit(-0)返回0?

()宏應返回一非零值的signbit當且僅當其參數值的 符號爲負。

爲什麼signbit(-0)返回0?我只是想了解這個決定背後的邏輯。

+4

必須使用二進制補碼 – Mike 2013-03-11 18:37:32

+1

0在內部表示爲0000000(很好,在8位),其符號位是0(因此它返回0),-1例如在內部表示爲11111111(8位),其符號位是1.這就是你所看到的 – 2013-03-11 18:38:19

回答

9

signbit(-0)

  • 0int類型的一個常數。
  • -0是否定0的結果,因此它是int類型的零。
  • 該值被轉換爲浮點數。
  • 在浮點值的符號位是零,因此signbit(-0)產生0

如果這樣做signbit(-0.)代替:

  • 0.double類型的一個常數。
  • -0.是否定0.的結果,因此它是double類型的負零。
  • 在浮點值的符號位爲一個,所以signbit(-0.)產生1.

的關鍵是,-0否定的整數類型,而整數類型通常不編碼負零從作爲不同正值爲零。當整數零轉換爲浮點時,結果是一個簡單的(正)零。然而,-0.否定了浮點類型,並且浮點類型將零負號清楚地編碼爲正零。

+0

C是否尊重文字'-0.0'並將其保持爲負數?我從來沒有在意過,所以我從來沒有檢查過... – cHao 2013-03-11 19:15:19

+1

cHao:基準C標準並不嚴格處理浮點。典型的實現,特別是那些使用IEEE 754的實現,會將符號位保持在浮點數零,特別是在簡單的操作中。 (例如,如果某些實現中的庫例程在簽名處理方面不太嚴格,我不會感到驚訝。) – 2013-03-11 19:26:55

11

在二進制補碼中,這是迄今爲止最常用的帶符號整數表示法,不存在負數零。 -0 == +0在所有情況下,甚至按位。因此,當宏的代碼處理它時,即使它包含((float) -0),標誌已經消失。

如果你想測試,你可能有更好的運氣,如signbit(-0.0)signbit(-1.0 * 0)。既然你不是從一個整數轉換到這一點,這個數字應該仍然有一個符號。

+1

符號位宏只對浮點數據進行操作,通常不用二進制補碼錶示。 – 2013-03-11 18:53:44

+0

@StephenCanon:恩。這很尷尬。 :)希望固定的解釋涵蓋了這一點。 – cHao 2013-03-11 18:54:38

2

它沒有。宏signbit返回浮點數據的文字符號位。注意文本:「如果參數的符號」是否定的,而不是「如果參數」是否定的。

腳註236在C標準闡明:

的signbit宏報告所有值,包括無窮大,零,和NaN的符號。

這是一個假設的問題,還是你有一個錯誤的執行?

+0

我剛剛學習C並嘗試各種功能。 – syntagma 2013-03-11 18:54:12

+2

「-0」的符號位是「0」。直到符號位丟失後纔會將其升級爲浮點類型。 – 2013-03-11 19:04:45

+0

@JonathanGrynspan:對,我沒有將'signbit(-0)'解釋爲字面的程序文本,但也許我應該有。 – 2013-03-11 19:23:18

相關問題