3 回答
TA贡献2039条经验 获得超7个赞
这是因为C中的各种隐式类型转换规则.C程序员必须知道其中有两个:通常的算术转换和整数提升(后者是前者的一部分)。
在char情况下,你有类型(signed char) == (unsigned char)
。这些都是小整数类型。其他这样的小整数类型是bool
和short
。该整数提升规则指出,当一个小的整数类型是操作的操作数,它的类型将得到提升到int
,这是签署。无论类型是签名还是未签名,都会发生这种情况。
在这种情况下signed char
,符号将被保留,并将被提升为int
包含值-5 的符号。在它的情况下unsigned char
,它包含一个值251(0xFB)。它将被提升为int
包含相同值的。你结束了
if( (int)-5 == (int)251 )
在整数的情况下,您有类型(signed int) == (unsigned int)
。它们不是小整数类型,因此整数促销不适用。相反,它们通常通过算术转换进行平衡,该转换声明如果两个操作数具有相同的“等级”(大小)但签名不同,则签名操作数将转换为与无符号操作数相同的类型。你结束了
if( (unsigned int)-5 == (unsigned int)-5)
TA贡献2051条经验 获得超10个赞
好问题!
该int
比较有效,因为这两个整数包含完全相同的位,所以他们基本上是相同的。但那是什么char
?
啊,C 在各种场合暗中提升char
s int
。这是其中之一。你的代码说if(a==b)
,但编译器实际上转向的是:
if((int)a==(int)b)
(int)a
是-5,但是(int)b
是251.这些肯定是不一样的。
编辑:正如@ Carbonic-Acid指出的那样,(int)b
只有当a char
为8位长时才是251 。如果int
是32位长,(int)b
则为-32764。
REDIT:如果一个字节长度不是8位,那么就会有很多评论讨论答案的本质。在这种情况下唯一的区别是,(int)b
不是251而是一个不同的正数,而不是-5。这与仍然非常酷的问题无关。
- 3 回答
- 0 关注
- 1097 浏览
添加回答
举报