C / C ++中十六进制转义码中的位数

时间:2010-04-29 06:07:47

标签: c++ unicode escaping

我和我的一位同事有争执。她说以下内容:

char* a = "\x000aaxz";

编译器将/可以看作“\ x000aa”。我不同意她,因为我认为在\x之后你最多可以有4个十六进制字符。你有超过4个十六进制字符吗?

谁在这里?

3 个答案:

答案 0 :(得分:30)

§2.13.2/ 4:

  

escape \ xhhh由   反斜杠后跟x后跟   一个或多个十六进制数字   用于指定的值   想要的性格。没有限制   到a中的位数   十六进制序列。一系列的   八进制或十六进制数字由第一个字符终止   不是八进制数字或十六进制数字   数字,分别。

她是对的。

但是,您可以通过热切的catenation提前终止它:文字序列"\x000a" "axz"指定一个四字符的字符串文字。 (2.13.4 / 3)

另请注意Unicode uses 21-bit code points;它不会停留在16位。

答案 1 :(得分:4)

从MSDN引用C ++字符常量:

  

以\ ooo形式指定的八进制转义序列由反斜杠和一个,两个或三个八进制字符组成。以\ xhhh形式指定的十六进制转义序列由字符\ x后跟一系列十六进制数字组成。与八进制转义常量不同,转义序列中的十六进制数字没有限制。

来自http://msdn.microsoft.com/en-us/library/6aw8xdf2.aspx

答案 2 :(得分:1)

好吧,就此而言,十六进制转义序列以非十六进制字符结尾, 例如\ x0abc9k是十六进制的0abc9,然后是'k' 所以为了结束十六进制序列,你必须在它的末尾使用两次双引号 例如\ x0ab“”c9k,只取0ab为十六进制

或者你也可以使用八进制转义序列,因为八进制转义序列中的数字是有限的,所以最多只有三个八进制数字。 例如\ o1234是八进制的123然后是'4'

所以,是的,她是对的。