多字节字符' \ 377777'工作?

时间:2018-04-11 10:40:16

标签: c++ c++11 static-cast narrowing multibyte-characters

当我尝试使用各种非标准方法为std::numeric_limits<size_t>::max()

找到allocator::max_size()时,Clang向我提到了这件事。

表达式大小似乎限制在4个字节,因此它看起来非常像一个impl定义的多字节字符,但我不知道它是如何工作的。

printf("0x%016hhX\n", '\377');     // 0x00000000000000FF
printf("0x%016X  \n", '\3777');    // 0x000000000000FF37
printf("0x%016X  \n", '\37777');   // 0x0000000000FF3737
printf("0x%016X  \n", '\377777');  // 0x00000000FF373737 [-Wfour-char-constants]
printf("0x%016X  \n", '\3777777'); // 0x0000000037373737 [ too long ]
printf("0x%016X  \n", '\3777777'); // 0x0000000037373737 [ too long ]

第2行 - 第4行似乎都返回int,但只有-Wfour-char-constants的第4行警告才会打开-Weveryting。为什么4字节字符必须警告其用户?

请解释它的工作原理。它是否有任何口语或可能是规范性的术语?

godbolt.org/g/7AR9nw

1 个答案:

答案 0 :(得分:3)

C ++标准未定义使用由\指定并用单引号字符括起的八进制常量的3位以上的行为。 (有趣的是,您可以使用超过2个十六进制数字来定义多字符常量,甚至可以使用'ab'之类的符号来定义,但是您获得的int的值是实现定义的。)

请参阅编译器文档以了解更长的八进制常量。