Gou*_*ham 10 c pointers alignment
以下程序测试英特尔处理器上的Little/Big endian.实际上小端是正确的输出.首先我铸造int到char*和没有初始化访问其价值int *.我是不理解输出的第二部分.这里int指针被转换为char *.那么为什么int指针没有改变它的对齐方式char *呢?
00000000 00000000 00000011 01111111 = 895
0 0 3 127
int main() {
int num = 895;
if(*(char *)&num == 127)
{
printf("\nLittle-Endian\n");
}
else
{
printf("Big-Endian\n");
}
int *p = (char *)&num ;
if(*p == 127)
{
printf("\nLittle-Endian\n");
}
else
{
printf("Big-Endian\n");
}
printf("%d\n",*p);
}
o/p
Little-Endian
Big-Endian
895
Run Code Online (Sandbox Code Playgroud)
使用此比较的程序的前半部分:
if(*(char *)&num == 127)
Run Code Online (Sandbox Code Playgroud)
看起来很好.
程序的后半部分包含以下任务:
int *p = (char *)&num ;
Run Code Online (Sandbox Code Playgroud)
哪个不是有效的代码.没有显式强制转换,您无法转换指针类型.在这种情况下,您的编译器可能会让您逃脱它,但严格来说,它是不正确的.这一行应为:
int *p = (int *)(char *)#
Run Code Online (Sandbox Code Playgroud)
或者只是这个等价的陈述:
int *p = #
Run Code Online (Sandbox Code Playgroud)
从这个例子中,我确信你可以看到为什么你的第二次测试不能按照你喜欢的方式工作 - 你仍然在整体int上运行,而不是你感兴趣的单个字节.如果你做了pa char *,它会以你期望的方式工作:
char *p = (char *)#
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
18823 次 |
| 最近记录: |