【发布时间】:2015-02-12 10:13:53
【问题描述】:
标题可能选错了,但我找不到这个问题的一个好的单行摘要。我的问题是我无法理解我的编译器在做什么,我想知道我是否在编译器中发现了一个错误......或者我对 C 语言的理解。
我的理解是:
-
- 1UL == ULONG_MAX,这是安全的,因为无符号数的溢出行为是明确定义的 - 产品
(- 1UL) * 1.0f涉及将左操作数转换为浮点数,并且此转换保留值(即ULONG_MAX),但舍入错误除外
到目前为止,我的编译器都同意,除非 1UL 来自变量。这是我的测试程序,其输出为 cmets:
#include <stdio.h>
int main(void)
{
unsigned long one = 1;
unsigned long minus_one = - one;
printf("%lu\n", - one); // 18446744073709551615
printf("%g\n", minus_one * 1.0f); // 1.84467e+19
printf("%g\n", (- one) * 1.0); // 1.84467e+19
printf("%g\n", (- 1UL) * 1.0f); // 1.84467e+19
printf("%g\n", (- one) * 1.0f); // -1
return 0;
}
我无法理解最后的输出。我尝试了各种优化级别和各种语言标准(C90、C99 和 C11),结果相同。有人知道吗?
环境:gcc 4.8.1 / Ubuntu Linux 14.04 / x86-64 (I32LP64)
编辑:我刚刚注意到我的问题可能与combination of unary minus and float conversion 重复。
【问题讨论】:
-
该程序在 Visual Studio 和我的 VM(Ubuntu 10.04,gcc 4.4.3)中给出了预期的输出。
标签: c implicit-conversion