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