VS2013字符文字不能作为MSDN的规范

时间:2016-04-27 09:55:20

标签: c++ visual-studio-2013 character literals

MSDN https://msdn.microsoft.com/en-us/library/69ze775t.aspx描述了VS字符文字如下:

  

文字中的多个字符根据需要从高 - >顺序填充相应的字节到低阶。要创建char值,编译器将获取低位字节。

根据该文件,以下结果应该是我想要的。

unsigned int i = '1234'; // i = 0x34333231, memory[low->high] [0x31, 0x32, 0x33, 0x34]

然而,当出现转义序列时,事情发生了变化,这是我在电脑上所做的结果。

unsigned int i = '1234'; // i = 0x34333231
unsigned int j = '\1\2\3\4\'; // j = 0x01020304 <- ???????

等一下,刚刚发生了什么?我期待那个变体j是0x04030201。从高阶到低阶的事情在哪里?我自己无法弄清楚。

这应该是我的第一个问题。当八进制转义发生时,为什么编译器不会将内存从高位填充到低位?

然而,不是整个故事,我会在这里展示一些更有趣的东西

unsigned int k = '0\101\1001'; // k = 0x31403041 memory[low->high] [0x41 0x30 0x40 0x31] ??what the hell
unsigned int l = '0\1011\100'; // l = 0x40304131 memory[low->high] [0x31 0x41 0x30 0x40] ??what the hell again

到目前为止,我完全输了。我甚至无法从这些测试用例中得出一个简单的规则。

没有人知道这个问题吗?感谢。

1 个答案:

答案 0 :(得分:0)

我认为这里没有矛盾。当您使用字符文字为int类型分配值时,它们的处理方式与分配给wchar_t的方式相同。唯一的区别是,int占用四个字节,wchar_t有两个字节(通常)。请参阅this中的以下示例:

wchar_t w1 = L'\100';   // L'@'
wchar_t w2 = L'\1000';  // C4066 L'@', 0 ignored 
wchar_t w3 = L'\009';   // C4066 L'\0', 9 ignored
wchar_t w4 = L'\089';   // C4066 L'\0', 89 ignored
wchar_t w5 = L'\qrs';   // C4129, C4066 L'q' escape, rs ignored
wchar_t w6 = L'\x0050'; // L'P'
wchar_t w7 = L'\x0pqr'; // C4066 L'\0', pqr ignored