与0xFF进行字符比较,即使它等于它,也会返回false,为什么?

时间:2017-06-26 23:12:10

标签: c++ char int

在C ++程序中,我有一些char buf[256]。问题出在这里:

if (buf[pbyte] >= 0xFF)
    buf[++pbyte] = 0x00;

即使buf[pbyte]等于255 AKA 0xFF,也会立即返回false,如立即窗口和监视窗口所示。因此,该声明不会被执行。但是,当我将其更改为以下内容时:

if (buf[pbyte] >= char(0xFF))
    buf[++pbyte] = 0x00;

该计划有效;怎么来的?

4 个答案:

答案 0 :(得分:4)

文字0xFF被视为int,其值为255。

charint进行比较时,char会在比较前提升为int

在某些平台上,char是一个带符号的值,其范围类似于-128到+127。在其他平台上,char是无符号值,范围为0到255。

如果平台的char已签名,且其位模式为0xFF,那么它可能为-1。由于-1是有效的int,促销活动就会停止。

你最终比较-1到255。

解决方案是消除隐式转换。您可以将比较写为:

if (buf[pbyte] == '\xFF') ...

现在双方都是char,所以他们将以同样的方式晋升,并且可以直接比较。

答案 1 :(得分:2)

问题是您的系统上已签署char

在公共2s补码表示中,带有“字节值”0xFF的带符号char表示整数-1,而0xFFint,值为255因此,您正在有效地比较int(-1) >= int(255),这会产生错误。请记住,由于算术转换规则,它们被比较为int,因此在比较之前,两个操作数都会被提升(“隐式转换”)到int

但是,如果你写了char(0xFF),那么你最终会得到比较-1 >= -1,这会产生预期的真实效果。

如果您想存储[0,255]范围内的数字,则应使用unsigned charstd::uint8_t代替char

答案 2 :(得分:1)

由于此条件下的整数促销

if (buf[pbyte] >= `0xFF`)

两个操作数转换为类型int(更确切地说,只有左操作数转换为类型int的对象,因为右操作数已经具有类型int) 。在您的系统中,类型char的行为类型为signed char,然后值'\xFF'为负值,等于-1。然后将此值转换为int类型的对象,您将获得0xFFFFFFFF(假设类型int占用4个字节)。

另一方面,整数常量0xFF是一个正值,具有内部表示,如0x000000FF

因此if语句中的条件

if ( 0xFFFFFFFF >= `0x000000FF`)

产生错误。

使用转换( char )0xFF时,两个操作数具有相同的类型和相同的值。

答案 3 :(得分:0)

默认情况下,整数文字会转换为int,假设该值适合int类型,否则会提升为long

因此,在您的代码中,您指定的0xFF被解释为int类型,即0x000000FF