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

C++ 原始数据(字节)和有符号/无符号变量,c++,c,byte,eof,unsigned,C++,C,Byte,Eof,Unsigned,有人告诉我,无论何时处理字节,都应该将变量声明为无符号字符。 在Windows的数据类型中,字节被声明为无符号字符 我的问题是: 为什么? Unsigned是从0到255、从128到-127的整数的表示形式 如果是这样,那么如何捕获二进制文件(-1)中的EOF? EOF在stdio.h中声明为-1#define宏。EOF是一种状态信息,与数据不同。但是,有些函数习惯于对这两种类型都使用单一返回类型。例如: /* Return next data byte (0 - 255) or EOF (-1

有人告诉我,无论何时处理字节,都应该将变量声明为无符号字符。 在Windows的数据类型中,字节被声明为无符号字符

我的问题是:

为什么?

Unsigned是从0到255、从128到-127的整数的表示形式

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


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

EOF是一种状态信息,与数据不同。但是,有些函数习惯于对这两种类型都使用单一返回类型。例如:

/* Return next data byte (0 - 255) or EOF (-1) if there was an error */
int readByte(...);

关键是,要做到这一点,您需要比普通字节更大的类型。

您使用
EOF
getchar()
等返回int的函数。因此,可以将int(0到255)的合法值映射到char(0到255)并仍然区分EOF int(-1)

从中引用关于getchar的返回值

成功时,返回读取的字符(提升为int值)。 返回类型为int以适应特殊值EOF,它 指示失败:如果标准输入位于文件末尾,则 函数返回EOF并设置stdin的EOF指示器(feof)。如果 如果发生其他读取错误,函数也会返回EOF,但是 改为设置其错误指示器(ferror)


从流中读取字符时,函数的返回类型是
int
,而不是
char
。常量的类型为
int
,而不是
char
无符号char

即使在C++ I/O API中,I/O流也像处理类型<代码> CARYTYPE (即流中的字符类型),以及ItnyType < /C> >,是.

FGEC(可以返回EOF的基本函数之一)被声明返回整数。 当您查看CRT函数时,您可以看到所有可以返回EOF的函数都有一个int签名

因此,事实上,在使用fgetc并将结果存储在char中时,始终会对char进行截断


无符号字符和字符之间没有很大区别。真正的区别在于编译器将其转换为int。在一种情况下,您有符号扩展名,而在另一种情况下(无符号)您没有符号扩展名。

EOF不是实字符,它只是一个返回值,意味着没有更多的输入可用。@stdio.h中的Theolodis-EOF声明为#ifndef EOF#define EOF(-1)#如果
char
signed
unsigned
,则endifIt的实现取决于此。另外,
EOF
int
而不是
char
。如果将
EOF
分配给
char
并将其与
int
EOF
进行比较,它们将不匹配,因为编译器将
char
扩展为
0x000000ff
,这与
int
0xffffff
不同(使用正常值)。是的,但是你永远不会把它解析成一个字节,因为它不在一个字节的范围内。为什么是无符号字符?因为一个字节有8位,给你0到255的范围。@AndyCarter Read