原始数据(字节)和有符号/无符号变量

时间:2014-05-06 10:58:27

标签: c++ c byte eof unsigned

我被告知无论何时使用字节,都应该将变量声明为无符号字符。 在Windows'数据类型,BYTE被声明为unsigned char。

我的问题:

为什么?

无符号表示0到255之间的整数,并将128符号表示为-127。

如果是这样,那么二进制文件(-1)中的EOF是如何被捕获的?

EOF在stdio.h中声明为-1 #define宏。

4 个答案:

答案 0 :(得分:3)

当您从流中读取字符时,std::getc等函数的返回类型为int,而不是char。常量EOF的类型为int,而不是charunsigned char

即使在C ++ I / O API中,像std::ifstream这样的I / O流也会处理类型char_type(即流中的字符类型),以及int_typetype 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)

您将EOFgetchar()等返回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。在一个案例中,你在另一个案例(未签名)中有一个符号扩展名,你没有。