0

在我的机器上,以下程序将 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可能与平台相关,必须以十六进制表示。

编辑:

换句话说,0xff & *(uint32_t*) str总是等于str[0]

嗯,没关系,刚刚意识到它是,也是为什么。

4

3 回答 3

4

您将字符串的字节序(只要我们谈论 ASCII 字符串就不存在)与整数的字节序混淆了。您系统上的整数是小端序。

要回答您的第二个问题,不,您不能打开字符串。如果您真的非常渴望提高速度,您可以为小端系统制作一个,为大端系统制作一个。

于 2012-09-28T14:25:45.220 回答
2

字节顺序是指较大值中的字节顺序。字符串(至少在 C 和 C++ 中)是一个字节数组,因此不适用字节顺序。

您实际上可以使用多字符文字来执行您在上一段中提到的操作,尽管它的实现定义了它的工作原理并且字符串必须不超过sizeof(int).

C++ 标准,§2.14.3/1 - 字符文字

(...) 包含多个 c-char 的普通字符文字是多字符文字。多字符文字具有 int 类型和实现定义的值。

例如,'abcd'int具有实现定义值的类型值。该值可能取决于字节序。由于它是一个整数,因此您可以打开它。

于 2012-09-28T14:37:37.400 回答
1

字节按递增的内存地址排列为 0x31、0x32、0x33、0x34。

在 32 位整数中,小端是 0x34333231。如果是大端 0x31323334。

(通常整数在偶数或 4 倍地址上对齐。)

于 2012-09-28T14:51:56.750 回答