c - `N.0 == N && (int)N.0 == N` 是否为真,其中 `N` 是 int 范围内的整数文字?

标签 c

N.0 == N && (int)N.0 == N 是否为真,其中 Nint< 范围内的整数文字?

一般情况下是真的还是假的?

最佳答案

如果我们将 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 double。然后有 int 不能表示为 double(例如 253+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 的东西。如果此类型能够表示所有 int,则该命题将为真。假设该类型称为 long double:

(long double) N == (long double) N && (int) (long double) N == N
//                 ^^^^^^^^^^^^^ implicit conversion

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

总结

命题是:

  • True 如果所有 int 都可表示为 double

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

  • 否则,错误

关于c - `N.0 == N && (int)N.0 == N` 是否为真,其中 `N` 是 int 范围内的整数文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31506963/

相关文章:

c - 使用 NXP Reader Library 读取 NFC Mifare 卡

c++ - 扫描速度慢的内存扫描器

c - 不同的语言如何在其标准库中实现排序?

c# - 使用 C 和 OpenSSL 进行 Base64 编码

c - C中X-Y坐标的递归冒泡排序

c - C 编译器不采用 5/9 来计算 fc

c - C 中矩阵的每个单元格的递归枚举

c - 如何将 64 位操作数相乘并可移植地得到 128 位结果?

c - 为什么我不能用 std=c99 声明 sigset_t?

c - 在循环中打印数组元素组