以下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/

10-10 03:26