0

i found this exercise online but i can't understand why the result is "aaaaaaaa". can you give me a hand ?

#include <stdio.h>

void a(char * s) {
    while(*s++ != '\0')
    printf("a");
}

int main() {
    int data[5] = {-1,-3,256,-4,0};
    a((char *) data);
    return 0;
}
4

2 回答 2

1

这是由于 C 的大小intcharC的大小不同而发生的。int数据类型占用 4 个字节,char占用 1 个字节。

由于函数 a() 将char *其作为参数,因此s++将一次增加 1 个字节,直到它看到一个具有00十六进制值的字节。

现在 -1ff ff ff ff
的十六进制值表示 int 是 -3 ff ff ff fd
的十六进制值表示 int 是 256 的十六进制值表示 int is00 00 01 00
等等。

while 循环将一次比较 1 个字节,将在打印“a”8 次后停止。

注意:小端与大端机器的遍历会有所不同。

在 256 的小端遍历中会像00 -> 01 -> 00 -> 00.
但是在 256 的大端遍历中会像00 -> 00 -> 01 -> 00

无论哪种方式,您都是00第一个,因此字节序不会影响答案。

于 2020-11-28T18:51:12.907 回答
0

如果 int 的大小为四个字节并且 int:s 使用二进制补码存储,则输出为 aaaaaaaa(八个 a:s) 。在数字 -1 和 -3 中,所有字节都不为零,因此打印了八个 a:s。在数字 256 中,最低有效(和最高有效)字节为零,因此这会停止 while 循环。

如果您使用每个字节打印数组字节

#include <stdio.h>

int main(void)
{
    int data[5] = {-1, -3, 256, -4, 0}, i;
    const char *p;

    p = (char *) data;
    for (i = 0; i < sizeof (data); i++) {
        printf(" %d", p[i]);
    }
    printf("\n");
    return 0;
}

你得到

-1 -1 -1 -1 -3 -1 -1 -1 0 1 0 0 -4 -1 -1 -1 0 0 0 0

在这里你可以看到第九个数字是零。

于 2020-11-28T18:23:50.460 回答