为什么编译器不抱怨溢出有符号字符?

时间:2021-04-29 22:54:51

标签: c++ char integer-overflow

我知道将整数值分配给有符号字符是个坏主意并且容易出错,例如分配返回值 - 从 std::cin.peek(), std::cin.get(void) 到 {{1} }.

例如:

char

如果我使用带有 char c = 255; // Undefined Behavior. (overflowing a singed char) 标志的 GCC 编译它,我会收到警告:

pedantic

没关系,感谢编译器发出警告。

但考虑一下:

warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘255’ to ‘'\37777777777'’ [-Woverflow]|

为什么编译器不抱怨将 char c; if( (c = std::cin.peek()) == '\n') std::cout << "end of line char detected!\n"; std::cin.get() 的返回值分配给 std::cin.peek() 类型的 c

  • 我使用相同的编译器和相同的标志进行编译。

  • 这是否意味着因为从非 constexpr 函数返回的值仅在运行时才知道,这就是编译器不兼容的原因。

  • 我认为我的猜测是正确的,考虑一下:

    char
  • 现在因为函数 constexpr int f(){return 255;} int main(){ char c = f(); } f,编译器在编译时而不是在运行时评估它,所以它知道它正在溢出 constexpr,因此它产生警告。

  • 这类似于访问 char 等容器的元素,当索引仅在运行时已知时,编译器不会产生任何警告,因为索引的值尚未存在编译时。

  • 我的猜测是真的吗?

0 个答案:

没有答案
相关问题