【问题标题】:Cannot understand this output from getw无法理解 getw 的此输出
【发布时间】:2014-09-19 01:48:14
【问题描述】:

我有这个

#include<stdio.h>
#include<stdlib.h>

int main() {

    int a = getw(stdin);

    if(ferror(stdin)) {
        printf("error occurred\n");
        exit(1);
    }        
    printf("%u\n", a);

}

我得到:

$ ./readstdin 
9876
909588537

你能帮忙解释一下输出吗?

我的机器: Linux abc-ubuntu 3.2.0-65-generic #98-Ubuntu SMP Wed Jun 11 20:27:07 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

【问题讨论】:

  • getw 定义在哪里?

标签: c


【解决方案1】:

首先,使用%u 打印int 是未定义的行为。在您的printf 通话中使用%d 或将a 转换为unsigned

其次,getw() 从流中读取一个字(或sizeof(int) 字节)。它执行二进制 I/O,而不是格式化 I/O。

假设 ASCII,字符 9 8 7 6 分别映射到值 0x390x380x370x36。在您的系统sizeof(int) == 4 中,getw 读取这四个字节,将它们存储到int 的空间中,然后返回该值。在little-endian系统中,最低有效字节存储在最低地址,因此存储的值为0x36373839,或者十进制的909588537

【讨论】:

  • @TC 很好的答案。谢谢。
【解决方案2】:

如果您打印从getw 返回的值的字节数,您会有所了解。

#include<stdio.h>

void printBytes(int a)
{
   int a1 = (a & 0xFF000000) >> 24;
   int a2 = (a & 0x00FF0000) >> 16;
   int a3 = (a & 0x0000FF00) >> 8;
   int a4 = (a & 0x000000FF);
   printf("%c%c%c%c\n", a1, a2, a3, a4);
}

int main() {

    int a = getw(stdin);

    if(ferror(stdin)) {
        printf("error occurred\n");
        return 1;
    }        
    printBytes(a);
    printf("%u\n", a);

    return 0;
}

示例输入:

1234

输出:

4321
875770417

在我的小端系统上,流“1234”被getw 转换为(4 &lt;&lt; 24) + (3 &lt;&lt; 16) + ( 2 &lt;&lt; 8) + 1)。在大端系统上,相同的流将被转换为(1 &lt;&lt; 24) + (2 &lt;&lt; 16) + (3 &lt;&lt; 8) + 4,这将导致825373492

【讨论】:

  • 为什么输出反了?你的机器是小端的?
  • @FiddlingBits,是的,我的系统是小端系统。
  • 在你的回答中可能值得注意。
  • @RSahu 字节序如何影响这里的答案?我认为第一个字节存储为最低有效字节,然后按照重要性增加的顺序存储后续字节。 T.C.上面有很好的解释。
  • @RSahu Endianness 只会影响字节在内存中的排列(寻址)方式。为什么它会影响最终答案(存储数据的价值)。
猜你喜欢
  • 2014-03-19
  • 2020-05-14
  • 2014-03-24
  • 1970-01-01
  • 2021-03-08
  • 2013-12-23
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多