字符串文字的字节顺序和case语句中字符串的用法

时间:2012-09-28 14:23:47

标签: c++ string endianness literals string-literals

在我的机器上,以下程序将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]

呃,没关系,只是意识到它是,也是为什么。

3 个答案:

答案 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倍地址上对齐。)