C 持久性问题?
以下代码的输出是什么C 持久性问题?,c,endianness,C,Endianness,以下代码的输出是什么 #include<stdio.h> int main() { int a[4]={4096,2,3,4}; char *p; p=a; printf("\n %d",(int)*(++p)); return 0; } sizeof int = sizeof(void*) = 4 bytes #包括 int main() { int a[4]={4096,2,3,4}; char*p; p=a; printf(“\n%d
#include<stdio.h>
int main()
{
int a[4]={4096,2,3,4};
char *p;
p=a;
printf("\n %d",(int)*(++p));
return 0;
}
sizeof int = sizeof(void*) = 4 bytes
#包括
int main()
{
int a[4]={4096,2,3,4};
char*p;
p=a;
printf(“\n%d”,(int)*(++p));
返回0;
}
sizeof int=sizeof(void*)=4字节
根据我的说法,小端机器的输出应该是16,大端机器的输出应该是0。我说得对吗?4096(十六进制0x1000)将在内存中表示为(假设8位字节,这在当今非常常见),如下所示:
[0x00, 0x00, 0x10, 0x00] (big-endian)
或
由于您正在使用%d打印它,它需要整数,但要传递一个取消引用的字符指针值(即,char
)并在取消引用之前递增指针,因此您将打印0x00或0x10,即十进制16。您可能需要添加一些cast来允许p=a
语句,因为您可以自由地混合类型
是的,我认为你是对的。4096是
0x1000
,所以(一旦你编译它),你会期望16有一个小的尾端表示,0有一个大的尾端表示,除非int
是24位宽(这将得到16)
所有这些都假设字符位=8,并且填充位没有什么有趣的事情。用
sizeof(int)==4进行编辑也排除了这些假设下的24位int
。这应该是一个编译器警告….:PWhy您认为这些将成为输出?在这台机器上,int的大小是多少?(请参阅)您是否打算先将printf的输入转换为int?使用(int)*(++p)
或*((int*)++p)
?int的大小是4字节,void*的大小也是4字节bytes@sje397:从技术上讲,我认为这无关紧要,至少在CHAR\u BIT==8
的情况下。char varargs参数被提升为int
或unsigned int
(6.5.2.2/7),可以将其读取为其中一个,因为值“16”和“0”可以在其中一个(7.15.1.1/2)中表示。不过,还是把它放进去吧……你忘了中端数,[0x00,0x00,0x00,0x10]
@christoff:你还忘了另一个中端数:[0x10,0x00,0x00,0x00]
:-)
[0x00, 0x10, 0x00, 0x00] (little-endian)