所以我看到了一些关于如何找到架构的字节顺序的例子。我们假设我们有一个指向int数据类型的整数指针。让我们说int值是0x010A0B12。在小端架构中,最低有效字节,即12,将存储在最低存储器地址中,对吗?因此,4字节整数中的最低字节为12。
现在,检查。如果我们声明了一个char指针p,并且将整数指针强制转换为char *并将其存储在p中,并打印出取消引用的p值,我们将获得该架构的字节序的线索。如果它是12,我们就是小端; 01表示大端。听起来真的很整洁......
int a = 0x010A0B12;
int *i = &a;
char *p = (char*)i;
printf("%d",*p); // prints the decimal equivalent of 12h!
这里有几个问题,真的。由于指针是强类型的,因此字符指针不应该严格指向char数据类型吗?用%d打印的是什么?难道我们不打算用%c打印字符吗?
答案 0 :(得分:6)
由于指针是强类型的,字符指针不应该严格指向char数据类型吗?
C有一条规则,即任何指针都可以安全地转换为char*
和void*
。因此,允许将int*
转换为char*
,并且它也是可移植的。指针将指向int
内部表示的初始字节。
我们不应该使用
%c
打印字符吗?
另一件事就是在这里:printf
的可变长度参数列表。当您将char
传递给printf
的无类型参数时,默认转化适用:char
转换为int
。这就是为什么%d
格式可以正常使用数字,并按照您的预期将其打印出来。
您也可以使用%c
。处理%c
说明符的代码将参数读为int
,然后将其转换为char
。 0x12
是一个特殊字符,所以你不会看到统一的打印输出。
答案 1 :(得分:-1)
由于指针是强类型的,字符指针不应该严格指向char数据类型吗?
这是一种未定义的行为 - 但是大多数理智的实现都会按照你的意思行事。所以大多数人都会说好。
用%d打印的是什么?
格式%d需要int类型的参数,并且通常的C规则将char类型的实际arg提升为int。所以这又好了。您可能不想使用%c,因为p指向的字节内容可能是任何字节,并不总是有效的文本字符。