如果N.0 == N && (int)N.0 == N
是N
范围内的整数字面值,int
是否为真?
一般是真的还是假的?
答案 0 :(得分:8)
如果我们将N.0
重写为(double) N
,我们会收到以下信息:
(double) N == N && (int) (double) N == N
然后,我们可以将隐式转换变为显式转换:
(double) N == (double) N && (int) (double) N == N
显然,(double) N == (double) N
总是如此。所以这是第二个可能失败的平等。
假设int
为64位且double
为IEEE双精度型。然后有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双精度,则该命题始终为真,因为所有int
都可以完全表示为double
在这些系统中。
正如chux所指出的,编译器可以为double
免费使用大于N.0
的内容。如果此类型能够代表所有int
,则该命题将成立。想象一下,该类型被称为long double
:
(long double) N == (long double) N && (int) (long double) N == N
// ^^^^^^^^^^^^^ implicit conversion
请注意,隐式转化现在必须转换为long double
,因为这些是==
的规则。结果是左手相等仍然始终为真,并且N
的右手相等性仍然是假的,无法使用浮点类型表示。
命题是:
True 如果所有int
都可以表示为double
。
否则, true 如果扩展精度用于常量,并且所有int
都可以使用该类型表示。
否则, false 。
答案 1 :(得分:1)
我正在'解析'你的问题意思是:
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的significand representation宽:
一个。 Cray实现64 bit ints and 64 bit floats and doubles Cray还实现了IEEE或浮点数的专有表示。
湾任何其他系统使用ILP64作为64位模型,64 IEEE使用浮点数,因为64 IEEE浮点数只有52位用于小数。
如果您阅读C11 standard的§6.4.4.1,则有许多N
的文字值,其中此示例陈述不正确:
一个。浮点文字不支持int
文字的法律文字(其中有许多,例如0x1.0p31
是合法的整数文字,但0x1.0p31.0
不是合法的双字面< / p>
湾0123
是一个八进制文字,但是0123.0
是一个基础10双字面,显然不相等(感谢chug)
℃。整数升可以是合法的并且大于指定的值。整数文字可以大于int或double