#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
为什么我会得到两个不同的数字?
答案 0 :(得分:8)
如果签名,则真实答案(150)超出char
(在正常系统上)的范围。此转换会调用未定义的行为;编译器可以随意做任何事情。
根据C99标准,6.3.1.4:
当实数浮点类型的有限值转换为_Bool以外的整数类型时, 丢弃小数部分(即,该值被截断为零)。如果值 整数部分不能用整数类型表示,行为是未定义的。
答案 1 :(得分:5)
45.72 / 0.3048
是150
。
您平台上的char
类型显然是一个8但已签名的类型。 150
超出了该类型的范围。这意味着行为未定义。其余部分如下。
例如,我通过ideone.com在GCC中获得127 127
,在MSVC中获得150 150
。你得到127 150
,这很有趣,但并不奇怪。