【发布时间】:2017-11-27 11:53:05
【问题描述】:
代码:
#include <cstdio>
int main() {
unsigned char a = -300.f;
printf("%d\n", a);
}
GCC 编译:
g++ test.cpp -o test -std=c++11
test.cpp: In function ‘int main()’:
test.cpp:4:21: warning: overflow in implicit constant conversion [-Woverflow]
unsigned char a = -300.f;
^
GCC 结果:
0
GCC 版本:
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
Clang 编译:
clang++ test.cpp -o test -std=c++11
test.cpp:4:21: warning: implicit conversion from 'float' to 'unsigned char' changes value from 300 to 255
[-Wliteral-conversion]
unsigned char a = -300.f;
~ ^~~~~
1 warning generated.
Clang 结果:
160
Clang 版本:
clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
也许标准没有定义这种行为。
添加-fsanitize=undefined后:
GCC结果(相同):
0
Clang 结果 (48!?):
test.cpp:4:20: runtime error: value -300 is outside the range of representable values of type 'unsigned char'
48
【问题讨论】:
-
从
Maybe the standard doesn't define this behavior.中删除maybe,你得到了答案。 -
您可能还想将您的问题限制在您指的是哪个标准。特别是,不要添加不相关的标签。
-
在两个编译器中都考虑
-fsanitize=undefined。那么两者都将始终不打印任何结果。 -
未定义的行为是未定义的
-
使用像
unsigned char a{-300.f};这样的统一初始化将无法编译。