【问题标题】:Can anyone help me with this exercise that i found online but i can't understand why the result is "aaaaaaaa". can you give me a hand? [closed]谁能帮我完成我在网上找到的这个练习,但我不明白为什么结果是“aaaaaaaa”。你能帮我个忙吗? [关闭]
【发布时间】:2020-11-28 18:01:41
【问题描述】:

我在网上找到了这个练习,但我不明白为什么结果是“aaaaaaaa”。你能帮帮我吗?

#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;
}

【问题讨论】:

  • 我建议你尝试打印(十六进制)每个假定的 char 的值,看看它们是什么。尝试将-3 更改为3,看看有什么不同。实验。
  • 调试器.......

标签: c endianness bit-representation


【解决方案1】:

这是因为 C 中 int 和 char 的大小不同。int 数据类型占用 4 个字节,char 占用 1 个字节。

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

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

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

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

在 256 的小端遍历中将类似于 00 -&gt; 01 -&gt; 00 -&gt; 00。
但是在 256 的大端遍历中会像 00 -&gt; 00 -&gt; 01 -&gt; 00

无论哪种方式,您都会首先获得00,因此字节序不会影响答案。

【讨论】:

    【解决方案2】:

    如果 int 的大小为 4 个字节并且 int:s 使用 two's complement 存储,则输出为 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-01-27
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多