c++ - 使用 == 运算符将 char 与 0x80 进行比较总是会导致 false?

标签 c++ types binary char byte

char byte = 0x80
if(byte == 0x80)
{
    cout << "This message never gets printed!";
}

十六进制值 0x80 在二进制中等价于 1000 0000,显然适合一个字节。

但是,编译器会警告我有关带有条件的行:

warning: comparison is always false due to limited range of data type

为什么在这种情况下条件的结果为假?

0x80 是否在条件条件下扩展为类似 0x80000000 的内容?

是否可以使用 == 运算符来检查 char 是否等于 0x80

最佳答案

问题是 char 在 C 和 C++ 标准中定义它可以是有符号或无符号值,并且 char 必须具有至少 8 位。所讨论的体系结构和编译器似乎使用带符号的 8 位 char 值。

这意味着任何具有最高位(第 7 位)的值都将是负值。所以 0x80 作为 char 变成 -128 十进制。

常量 0x80 不是 char 值,它是 int 值。

因此,当您将 -128 与 0x80 (128) 进行比较时,它们并不相同,而且永远不可能相同,编译器会发现这一点并发出警告。

有多种方法可以实现这一点,以下是几种可能的情况:

首先,我们可以将其中一个值转换为另一个值的类型:

if (((int)byte) & 0xff == 0x80)

if (byte == (char)0x80) 

或者,我们可以将常量变成char 值,而不是int 值。

if (byte == '\200')     // Octal 200 = 0x80. 

if (byte == '\x80')

或者,使用 unsigned char byte = 0x80; - 指定它是一个 unsigned char 将确保它不会“翻转为负数”。

关于c++ - 使用 == 运算符将 char 与 0x80 进行比较总是会导致 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17844622/

相关文章:

C++ 获取文件总行号

c++ - 在 Arch Linux 中使用 c++ Boost 正则表达式库

c - 如果一个二进制文件的内容出现在另一个二进制文件中,如何在 C 中搜索?

c - K&R C 练习帮助

haskell - 在 Haskell 中处理签名的二进制数据而不使用 unsafeCoerce

c++ - 使用 gluPerspective()

c# - 需要检查两个 View 模型的类型以查看它们是否源自同一基础

r - 使用 R 中 readr 中的 read_csv 将文本作为指定列以 [type] 打开

typescript - 无类型函数调用可能不接受类型参数。ts(2347)

c++ - begin() 和 rend() 有什么区别?