在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;
该计划有效;怎么来的?
答案 0 :(得分:4)
文字0xFF
被视为int
,其值为255。
将char
与int
进行比较时,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
,而0xFF
是int
,值为255因此,您正在有效地比较int(-1) >= int(255)
,这会产生错误。请记住,由于算术转换规则,它们被比较为int
,因此在比较之前,两个操作数都会被提升(“隐式转换”)到int
。
但是,如果你写了char(0xFF)
,那么你最终会得到比较-1 >= -1
,这会产生预期的真实效果。
如果您想存储[0,255]范围内的数字,则应使用unsigned char
或std::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