GCC与Clang之间的不同行为

cha*_*ink 2 c++ gcc g++ clang

码:

#include <cstdio>

int main() {
    unsigned char a = -300.f;
    printf("%d\n", a);
}
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会编制:

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;
                     ^
Run Code Online (Sandbox Code Playgroud)

GCC结果:

0
Run Code Online (Sandbox Code Playgroud)

GCC版本:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

铿锵的结果:

160
Run Code Online (Sandbox Code Playgroud)

铿锵版:

clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Run Code Online (Sandbox Code Playgroud)

也许标准没有定义这种行为.


添加后-fsanitize=undefined:

GCC结果(同样):

0
Run Code Online (Sandbox Code Playgroud)

Clang结果(48!?):

test.cpp:4:20: runtime error: value -300 is outside the range of representable values of type 'unsigned char'
48
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 6

上的转换行为浮点类型到一个unsigned char其中浮点值的范围之外unsigned char未定义的.

注意,这与原始类型是更宽的整数类型的情况不同.