是'N.0 == N&& (int)N.0 == N` true其中`N`是int范围内的整数字面值?

时间:2015-07-19 23:21:08

标签: c

如果N.0 == N && (int)N.0 == NN范围内的整数字面值,int是否为真?

一般是真的还是假的?

2 个答案:

答案 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

有些情况并非如此。

  1. 任何时候整数都比float的significand representation宽:

    一个。 Cray实现64 bit ints and 64 bit floats and doubles Cray还实现了IEEE或浮点数的专有表示。

    湾任何其他系统使用ILP64作为64位模型,64 IEEE使用浮点数,因为64 IEEE浮点数只有52位用于小数。

  2. 如果您阅读C11 standard的§6.4.4.1,则有许多N的文字值,其中此示例陈述不正确:

    一个。浮点文字不支持int文字的法律文字(其中有许多,例如0x1.0p31是合法的整数文字,但0x1.0p31.0不是合法的双字面< / p>

    0123是一个八进制文字,但是0123.0是一个基础10双字面,显然不相等(感谢chug)

    ℃。整数升可以是合法的并且大于指定的值。整数文字可以大于int或double

  3. 的赋值