C/ c++类型转换不同于函数和表达式
C/C++ casting different with function versus expression?
#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
,这很有趣,但并不奇怪。
相关文章:
- C++模板函数中的初始化 - 新的初始值设定项表达式列表被视为复合表达式
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 折叠表达式和函数名称查找
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 不是 lambda 函数中的常量表达式
- 保证逻辑 AND 表达式中的函数调用
- std::cout 在打印变量与函数表达式时的行为不同
- C2276 '&':对绑定成员函数表达式的非法操作
- 函数表达式的字符串转换,带有 Catch 断言中的参数
- 为什么返回非引用类型的函数表达式被认为是prvalues而不是xvalues
- 定义函数时,哪种类型是lambda函数/表达式
- '&' :对绑定成员函数表达式的非法操作
- 如何解析和调用c++类函数表达式
- "&":对绑定成员函数表达式的非法操作。从关键点矢量 OpenCV 获取容量
- 如何使boost-proto函数表达式可流化
- "!"绑定成员函数表达式的非法操作
- lambda 函数/表达式是否支持 constexpr