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

Ale*_*rie 4 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;
}
Run Code Online (Sandbox Code Playgroud)

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

127
150
Run Code Online (Sandbox Code Playgroud)

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

Oli*_*rth 8

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

根据C99标准,6.3.1.4:

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


AnT*_*AnT 5

45.72 / 0.3048150.

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

例如,我127 127通过ideone.com和150 150MSVC 进入GCC .你有127 150,这很有趣,但并不奇怪.