C/ c++类型转换不同于函数和表达式

C/C++ casting different with function versus expression?

本文关键字:函数 表达式 不同于 类型转换 c++      更新时间:2023-10-16
#include <stdio.h>
double metersToFeet(double meters)
{
    return meters / 0.3048;
}
int main()
{
    printf("%un", (unsigned char)(char)(45.72 / 0.3048));
    printf("%un", (unsigned char)(char)metersToFeet(45.72));
    return 0;
}

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

127
150

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

真实答案(150)超过char的范围(在正常系统上),如果它被签名。此转换调用未定义行为;编译器可以自由地做任何它喜欢做的事情。

来自C99标准,6.3.1.4:

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

45.72 / 0.3048 is 150

在您的平台上,

类型char显然是一个8-but signed类型。150超出了该类型的范围。这意味着行为未定义。

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