![](/img/trans.png)
[英]How does `int sum = n + - + - + - + n` compile where `n` is an `int`?
[英]Is `N.0 == N && (int)N.0 == N` true where `N` is an integer literal in the range of int?
N.0 == N && (int)N.0 == N
真的嗎,其中N
是int
范圍內的int
?
總的來說是真的還是假的?
如果將N.0
重寫為(double) N
, N.0
得到以下結果:
(double) N == N && (int) (double) N == N
然后,我們可以將隱式轉換成顯式強制轉換:
(double) N == (double) N && (int) (double) N == N
顯然, (double) N == (double) N
始終為真。 因此,第二個平等可能失敗。
假設int
是64位,而double
是IEEE的double。 然后有int
不能表示為double
(例如2 53 +1),從而使命題為假。 具有64位int
系統很少見,但它們存在。 在此,使^
表示冪。
(int) (double) (2^53 + 1) == 2^53 + 1
(int) (2^53) == 2^53 + 1
2^53 == 2^53 + 1
false
如果已知int
是32位並且double
是IEEE double,那么該命題始終是正確的,因為在這些系統中所有int
都可以精確地表示為double
。
chux指出,對於N.0
,編譯器可以自由使用大於double
的N.0
。 如果此類型能夠表示所有int
,則該命題將為真。 想象一下,該類型稱為long double
:
(long double) N == (long double) N && (int) (long double) N == N
// ^^^^^^^^^^^^^ implicit conversion
注意,隱式轉換現在必須是到long double
的轉換,因為這是==
的規則。 結果是,對於不能使用浮點類型表示的N
,左手等式始終始終為true,而右手等式仍為false。
命題是:
如果所有int
都可表示為double
則為true 。
否則,如果常量使用擴展精度,則為true ,並且所有int
均可使用該類型表示。
否則,為false 。
我正在“解析”您的問題的意思是:
Given C99 (or C11)
Are there C integer literal values for N such that:
N.0 == N && (int)N.0 == N
^ ^ 'N' with a '.0' making it a double literal
^ ^ 'N' as a standalone C int literal
^ cast the double literal to an int
在某些情況下,這是不正確的。
任何時候只要整數大於float的有效位數表示形式 :
一種。 Cray實現64位整數和64位浮點數和雙精度值 Cray還實現IEEE或浮點數的專有表示形式。
b。 因為64個IEEE浮點數只有52位十進制數,所以任何其他使用ILP64為其64位模型和64個IEEE浮點數的系統。
如果您閱讀C11標准的 §6.4.4.1,則該示例語句為true時,會有許多N
文字值:
一種。 int
文字不支持int
文字的合法文字(其中有很多,例如0x1.0p31
是合法的整數文字,而0x1.0p31.0
則不是合法的雙重文字)
b。 0123
是八進制文字,但0123.0
是以10為底的雙0123.0
文字,並且顯然不相等(感謝突突)
C。 整數升可以是合法的,也可以大於分配的值。 整數文字可以大於int或double的分配值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.