我有这个
#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
答案 0 :(得分:11)
首先,使用%u
打印int
是未定义的行为。在%d
来电中使用a
或投放unsigned
到printf
。
其次,getw()
从流中读取一个单词(或sizeof(int)
个字节)。它执行二进制I / O,而不是格式化I / O.
假设ASCII,字符9
8
7
6
映射到值0x39
,0x38
,0x37
和{分别为{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
。