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
到目前为止,我完全输了。我甚至无法从这些测试用例中得出一个简单的规则。
没有人知道这个问题吗?感谢。
答案 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