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)