当char或wchar_t==-1时,它意味着什么

What does it mean when a char or wchar_t == -1?

本文关键字:-1时 意味着 什么 char wchar      更新时间:2023-10-16

在Visual Studio中,为什么要将字符(以前是char,现在是wchar_t)的值与-1的值进行比较?

我有一个项目有多个无效的检查-1:

TCHAR ch;
...
if(ch==-1)

Coverity告诉我,"ch==-1"无论其操作数的值如何,都总是错误的。"

现在,它最初是为了使用char值而不是wchar_t编写的,并且在需要unicode支持时进行了升级。我需要弄清楚为什么要对照-1检查"char ch;",这样我就可以对照wchar_t进行类似的检查。

整数常数EOF通常被#定义为-1。如果这是您的代码正在检查的内容(取决于ch来自哪里),那么相应的wchar_t比较将是WEOF,并且相应的Windows TCHAR宏似乎是_TEOF。

PS:正如评论中绝对正确地指出的那样,如果一个值被转换为charwchar_t,那么将其与EOFWEOF进行比较就太晚了:许多编码使用字符'xff'作为有效字母,在这种转换后,这与EOF无法区分。代码完全错误:变量ch需要具有类型int/wint_t/_TINT,这样的比较才会有效。

大多数情况下,-1/255EOF 关联

TCHAR的类型是什么?如果它真的是一个无符号类型小于int,则该表达式永远不可能为真,因为将进行整体提升,从而产生巨大的积极影响整数,但仍小于UINT_MAX,其中为-1是CCD_ 22。(如果CCD_ 23类似于CCD_,例如,它通常可以具有范围内的值0…65365,将转换为intunsigned int而不改变值-1,另一方面,将通常转换为4294967295未签名。)

如果您正在检查文件结尾(例如std::iwstream.get()),那么您应该在转换来自CCD_ 28的结果。即使使用char工作如果普通char是无符号的,那么它永远不可能是-1,并且如果已签名,则为一个有效字符(ISO 8859-1中的ÿ)将显示为文件结尾。

相关文章: