它是否正确?
不,静态代码检查器出错(1)。
unsigned char 的按位运算可以产生负数吗?
一些按位运算可以 - 例如按位补码 - 但不能异或。
对于^
,unsigned char
这里的参数受制于通常的算术转换(6.3.1.8),它们首先根据整数提升进行提升;关于这些,第 6.3.1.1 条第 2 段说
如果 anint
可以表示原始类型的所有值(受宽度限制,对于位域),则该值将转换为int
; 否则,将其转换为unsigned int
. 这些被称为整数促销。
所以,有两种可能:
Anint
可以表示 的所有可能值unsigned char
。那么从整数提升中获得的所有值都是非负的,这些值的按位异或也是非负的,余数MAX
也是模数。的值hash
则在从 0(包括)到MAX
(不包括)[ -MAX
if MAX < 0
] 的范围内。
int
不能代表 的所有可能值unsigned char
。然后将值提升为 type unsigned int
,并在该类型上执行按位运算。结果当然是非负的,余数模MAX
也将是非负的。但是,在这种情况下,赋值int hash
可能会将超出范围的值转换为负值[将超出范围的整数转换为有符号整数类型是实现定义的]。(1)但在这种情况下,可能的负值范围大于-255
to -1
,因此即使在这种情况下(非常不可能),静态代码检查器也有部分错误。
应该将 hash 声明为unsigned int
?
这取决于 的值MAX
。MAX
如果余数模数超出 的范围的可能性很小int
,那么这会更安全。否则,int
同样安全。