nir*_*wap 5 c pointers casting endianness
所以我看到了一些关于如何找到架构的字节顺序的例子.假设我们有一个指向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!
Run Code Online (Sandbox Code Playgroud)
这里有几个问题,真的.由于指针是强类型的,字符指针不应该严格指向char数据类型吗?用%d打印的是什么?难道我们不应该用%c打印字符吗?
由于指针是强类型的,字符指针不应该严格指向char数据类型吗?
C有一个规则,任何指针都可以安全地转换为char*和void*.转换的int*到char*,因此,是允许的,并且它也便于携带.指针将指向您int内部表示的初始字节.
%c为了品格,我们不应该打印吗?
另一件事就是在这里:可变长度参数列表printf.将a传递char给无类型参数时printf,默认转换适用:char转换为int.这就是为什么%d格式的数字很好,并按照您的预期打印出来.
你也可以用%c.处理%c说明符的代码将参数作为a读取int,然后将其转换为char.0x12但是,它是一个特殊字符,所以你不会看到它的统一打印输出.
| 归档时间: |
|
| 查看次数: |
2942 次 |
| 最近记录: |