我被告知无论何时使用字节,都应该将变量声明为无符号字符。 在Windows'数据类型,BYTE被声明为unsigned char。
我的问题:
为什么?
无符号表示0到255之间的整数,并将128符号表示为-127。
如果是这样,那么二进制文件(-1)中的EOF是如何被捕获的?
EOF在stdio.h中声明为-1 #define宏。
答案 0 :(得分:3)
当您从流中读取字符时,std::getc
等函数的返回类型为int
,而不是char
。常量EOF的类型为int
,而不是char
或unsigned char
。
即使在C ++ I / O API中,像std::ifstream这样的I / O流也会处理类型char_type
(即流中的字符类型),以及int_type
是type that can hold all values of char_type
, plus EOF
。
答案 1 :(得分:1)
EOF是状态信息,与数据不同。但是有些函数习惯使用单一返回类型。例如:
/* Return next data byte (0 - 255) or EOF (-1) if there was an error */
int readByte(...);
要点是你需要比普通字节更大的类型才能做到这一点。
答案 2 :(得分:1)
您将EOF
与getchar()
等返回int的函数一起使用。因此可以将int(0到255)的合法值映射到char(0到255)并仍然区分EOF int(-1)
从cplusplus.com引用getchar的返回值。
成功时,返回字符读取(提升为int值)。 返回类型为int以适应特殊值EOF,即 表示失败:如果标准输入位于文件末尾,则表示失败 函数返回EOF并设置stdin的eof指标(feof)。如果 发生了一些其他读取错误,该函数也返回EOF,但是 设置其错误指示符(ferror)。
答案 3 :(得分:0)
fgetc(可以返回EOF的基本函数之一)被声明为返回一个整数。
当您查看CRT函数时,您可以看到所有可以返回EOF的函数都有一个int签名。
因此实际上,当使用fgetc并将结果存储在char中时,您总是对char进行截断。
unsigned char和char之间没有太大区别。真正的区别在于编译器将其转换为int。在一个案例中,你在另一个案例(未签名)中有一个符号扩展名,你没有。