C / C ++与功能与表达不同?

时间:2013-06-05 00:13:19

标签: c++ c

#include <stdio.h>

double metersToFeet(double meters)
{
    return meters / 0.3048;
}

int main()
{
    printf("%u\n", (unsigned char)(char)(45.72 / 0.3048));
    printf("%u\n", (unsigned char)(char)metersToFeet(45.72));
    return 0;
}

该程序输出(在GCC和Clang上):

127
150

为什么我会得到两个不同的数字?

2 个答案:

答案 0 :(得分:8)

如果签名,则真实答案(150)超出char(在正常系统上)的范围。此转换会调用未定义的行为;编译器可以随意做任何事情。

根据C99标准,6.3.1.4:

  

当实数浮点类型的有限值转换为_Bool以外的整数类型时,   丢弃小数部分(即,该值被截断为零)。如果值   整数部分不能用整数类型表示,行为是未定义的。

答案 1 :(得分:5)

45.72 / 0.3048150

您平台上的char类型显然是一个8但已签名的类型。 150超出了该类型的范围。这意味着行为未定义。其余部分如下。

例如,我通过ideone.com在GCC中获得127 127,在MSVC中获得150 150。你得到127 150,这很有趣,但并不奇怪。