從開放組基本規格版本7,IEEE標準1003.1-2008:爲什麼signbit(-0)返回0?
()宏應返回一非零值的signbit當且僅當其參數值的 符號爲負。
爲什麼signbit(-0)
返回0
?我只是想了解這個決定背後的邏輯。
從開放組基本規格版本7,IEEE標準1003.1-2008:爲什麼signbit(-0)返回0?
()宏應返回一非零值的signbit當且僅當其參數值的 符號爲負。
爲什麼signbit(-0)
返回0
?我只是想了解這個決定背後的邏輯。
在signbit(-0)
:
0
是int
類型的一個常數。-0
是否定0
的結果,因此它是int
類型的零。signbit(-0)
產生0如果這樣做signbit(-0.)
代替:
0.
是double
類型的一個常數。-0.
是否定0.
的結果,因此它是double
類型的負零。signbit(-0.)
產生1.的關鍵是,-0
否定的整數類型,而整數類型通常不編碼負零從作爲不同正值爲零。當整數零轉換爲浮點時,結果是一個簡單的(正)零。然而,-0.
否定了浮點類型,並且浮點類型將零負號清楚地編碼爲正零。
C是否尊重文字'-0.0'並將其保持爲負數?我從來沒有在意過,所以我從來沒有檢查過... – cHao 2013-03-11 19:15:19
cHao:基準C標準並不嚴格處理浮點。典型的實現,特別是那些使用IEEE 754的實現,會將符號位保持在浮點數零,特別是在簡單的操作中。 (例如,如果某些實現中的庫例程在簽名處理方面不太嚴格,我不會感到驚訝。) – 2013-03-11 19:26:55
在二進制補碼中,這是迄今爲止最常用的帶符號整數表示法,不存在負數零。 -0 == +0
在所有情況下,甚至按位。因此,當宏的代碼處理它時,即使它包含((float) -0)
,標誌已經消失。
如果你想測試,你可能有更好的運氣,如signbit(-0.0)
或signbit(-1.0 * 0)
。既然你不是從一個整數轉換到這一點,這個數字應該仍然有一個符號。
符號位宏只對浮點數據進行操作,通常不用二進制補碼錶示。 – 2013-03-11 18:53:44
@StephenCanon:恩。這很尷尬。 :)希望固定的解釋涵蓋了這一點。 – cHao 2013-03-11 18:54:38
它沒有。宏signbit
返回浮點數據的文字符號位。注意文本:「如果參數的符號」是否定的,而不是「如果參數」是否定的。
腳註236在C標準闡明:
的signbit宏報告所有值,包括無窮大,零,和NaN的符號。
這是一個假設的問題,還是你有一個錯誤的執行?
我剛剛學習C並嘗試各種功能。 – syntagma 2013-03-11 18:54:12
「-0」的符號位是「0」。直到符號位丟失後纔會將其升級爲浮點類型。 – 2013-03-11 19:04:45
@JonathanGrynspan:對,我沒有將'signbit(-0)'解釋爲字面的程序文本,但也許我應該有。 – 2013-03-11 19:23:18
必須使用二進制補碼 – Mike 2013-03-11 18:37:32
0在內部表示爲0000000(很好,在8位),其符號位是0(因此它返回0),-1例如在內部表示爲11111111(8位),其符號位是1.這就是你所看到的 – 2013-03-11 18:38:19