【发布时间】:2018-07-05 05:58:31
【问题描述】:
这是我发现的一些奇怪的东西:
当我有一个由三个元素组成的 char* s,并将其分配为“21”时,
s 的打印 short int 值似乎是 12594,与二进制的 0010001 0010010 相同,对于单独的 char 则为 49 50。但是根据 ASCII 图表,'2' 的值为 50,'1' 的值为 49。
当我将 char 向右移动时,
*(short*)s >>= 8,结果与 (1.) 一致,即 '1' 或 49。但在我分配 char*s = '1'后,打印的字符串为s 也似乎是“1”,我之前认为它会变成“11”。
我现在对如何将位存储在 char 中感到有些困惑,希望有人能解释一下。
以下是我使用的代码:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("%lu,%lu\n",sizeof(char), sizeof(short));
char* s = malloc(sizeof(char)*3);
*s = '2', *(s+1) = '1', *(s+2) = '\0';
printf("%s\n",s);
printf("%d\n",*(short int*)s);
*(short*)s >>= 8;
printf("%s\n",s);
printf("%d\n",*(short int*)s);
*s = '1';
printf("%s\n",s);
return 0;
}
输出是:
1,2
21
12594
1
49
1
这个程序是在 macOS 上用 gcc 编译的。
【问题讨论】:
-
你知道“字节序”吗?
-
不,什么是“字节序”? @Yunnosch
-
还是“小端”和“大端”?
-
是的。定义您想要检测的字节序。研究它是如何变得可见和测试的。您可以在函数中执行此操作并返回布尔值或枚举“小”或“大”。例如,您显示的代码实际上就是这样的测试。如果你得到你所期望的,就返回一个字节序,如果没有,则返回另一个。然而,在不冒未定义行为的风险的情况下做到这一点更具挑战性。也许社区有一个想法。但是,您应该在单独的问题中询问它并事先搜索重复项。