从getw无法理解这个输出

时间:2014-07-27 21:04:33

标签: c

我有这个

#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

2 个答案:

答案 0 :(得分:11)

首先,使用%u打印int是未定义的行为。在%d来电中使用a或投放unsignedprintf

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

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

答案 1 :(得分: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

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