在我的机器上,以下程序将1234写入其输出。
const char str[] = "1234";
printf("%c%c%c%c\n",
(int) (0xff & (*(uint32_t*) str) >> 0),
(int) (0xff & (*(uint32_t*) str) >> 8),
(int) (0xff & (*(uint32_t*) str) >> 16),
(int) (0xff & (*(uint32_t*) str) >> 24));
这意味着str
在内部表示为0x34333231
,第一个字节str[0]
表示最低有效8位。
这是否意味着str
以小端编码?这个程序的输出是否依赖于平台?
此外,是否有方便的方法在switch case语句中使用1,2,4和8个字符串文字?我找不到任何方法将字符串转换为整数,因为*(const uint32_t* const) "1234"
不是常量表达式,0x34333231
/ 0x31323334
可能是平台相关的,必须以十六进制表示。< / p>
修改
换句话说,0xff & *(uint32_t*) str
总是等于str[0]
?
呃,没关系,只是意识到它是,也是为什么。
答案 0 :(得分:4)
对于字符串的字节顺序(只要我们讨论ASCII字符串,它不存在)会产生整数的字节顺序。系统上的整数是小端。
要回答第二个问题,请不要打开字符串。如果你真的非常渴望提高速度,你可以为小端系统制作一个,为大端系统制作一个。
答案 1 :(得分:2)
字节顺序是指较大值中的字节顺序。字符串(至少在C和C ++中)是一个字节数组,因此字节顺序不适用。
你实际上可以使用多字符文字来完成你在上一段中提到的内容,尽管它的实现确切地定义了它的工作方式,字符串必须不超过sizeof(int)
。
C ++标准,§2.14.3/ 1 - 字符文字
(...)包含多个c-char的普通字符文字是多字符文字。多字符文字具有int类型和实现定义值。
例如,'abcd'
是具有实现定义值的int
类型的值。该值可能取决于字节序。由于它是一个整数,因此您可以打开它。
答案 2 :(得分:0)
字节的布局与增加的内存地址一样,为0x31,0x32,0x33,0x34。
在一个32位整数是小端,你有0x34333231。如果是大端0x31323334。
(通常整数在偶数或4倍地址上对齐。)