以下C代码的输出是什么。假设它在Little endian机器上运行,其中short int占用2字节,而char占用1字节。
#include<stdio.h>
int main() {
short int c[5];
int i = 0;
for(i = 0; i < 5; i++)
c[i] = 400 + i;
char *b = (char *)c;
printf("%d", *(b+8));
return 0;
}
在我的机器上
-108
我不知道我的机器是Little Endian还是Big Endian。我发现应该给的地方
148
作为输出。因为404(即元素c [4])的低8位是148。但是我认为由于“%d”,它应该从c [4]的地址开始从内存中读取2个字节。
最佳答案
c[4]
存储404
。在两字节的小尾数表示中,这表示两个字节的0x94
0x01
或(十进制)148
1
。b+8
寻址c[4]
的内存。 b
是指向char
的指针,因此8
表示添加8个字节(4个2个字节的短裤)。换句话说,b+8
指向c[4]
的第一个字节,其中包含148
。*(b+8)
(也可以写为b[8]
)取消引用指针,因此为您提供值148
作为char
。这是由实现定义的:在许多常见平台上,char
是带符号类型(范围为-128
.. 127
),因此实际上不能为148
。但是,如果它是无符号类型(范围为0
.. 255
),则148
很好。
二进制148
的位模式为10010100
。将此解释为二进制补码会得到-108
。
然后,此char
值(为148
或-108
)将自动转换为int
,因为它出现在变量自变量函数(printf
)的参数列表中。这不会更改值。
最后,"%d"
告诉printf
接受int
参数并将其格式化为十进制数字。
因此,回顾一下:假设您有一台机器,
一个字节是8位
负数使用二进制补码short int
是2个字节
...然后该程序将输出-108
(如果char
是带符号的类型)或148
(如果char
是无符号的类型)。
关于c - 以下C代码的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45650291/