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

xiv*_*r77 1 c

N.0 == N && (int)N.0 == N真的,N在整数字面的范围内int

这是真的还是假的?

Die*_*Epp 8

如果我们重写N.0(double) N,我们得到以下内容:

(double) N == N && (int) (double) N == N
Run Code Online (Sandbox Code Playgroud)

然后,我们可以将隐式转换转换为显式转换:

(double) N == (double) N && (int) (double) N == N
Run Code Online (Sandbox Code Playgroud)

显然,(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
Run Code Online (Sandbox Code Playgroud)

如果int已知是32位并且double是IEEE双精度,则该命题始终为真,因为所有这些都int可以像double在这些系统中那样完全表示.

扩展精度

正如chux指出的那样,编译器可以自由地使用比doublefor 更大的东西N.0.如果这种类型能够代表所有int,那么这个命题就是真的.想象一下这个类型叫做long double:

(long double) N == (long double) N && (int) (long double) N == N
//                 ^^^^^^^^^^^^^ implicit conversion
Run Code Online (Sandbox Code Playgroud)

请注意,隐式转换现在必须是转换long double,因为这些是规则==.结果是左手相等仍然是真的,右手相等仍然是假的,N因为无法使用浮点类型来表示.

摘要

这个命题是:

  • 如果所有int都可以表示为真,则为double.

  • 否则,如果扩展精度用于常量,则为true,并且所有int都可以使用该类型表示.

  • 否则,.

  • @ xiver77:听起来你想知道C中`double`类型的要求是什么.为此,我建议你去阅读C标准. (2认同)