当乘以浮点数时,无符号长整数可以变为负数吗?

时间:2015-02-12 10:13:53

标签: c implicit-conversion

标题可能选择不当,但我找不到这个问题的好的单行摘要。我的问题是我无法弄清楚我的编译器在做什么,我想知道我是否在编译器中发现了一个错误......或者我对C语言的理解。

我的理解是:

  • - 1UL == ULONG_MAX,这是安全的,因为无符号数的溢出行为已明确定义
  • 产品(- 1UL) * 1.0f涉及将左操作数转换为float,此转换保留值(即ULONG_MAX),但舍入错误除外

到目前为止,我的编译器同意,除非1UL来自变量。这是我的测试程序,其输出为注释:

#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重复。

1 个答案:

答案 0 :(得分:3)

这似乎是gcc 4.8中的一个错误。我有与4.8相同的行为,但gcc 4.9和clang显示纠正后的行为。