添加有符号和无符号值时,我们遵循这两条规则(来自https://stackoverflow.com/a/2280810/1073672)
否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则带有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。 / p>
否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数的操作数的类型类型。
将触发上述哪些规则:
unsigned int ui = 4;
ui = ui + 532;
答案 0 :(得分:2)
常量532
的类型为int
,已签名。
查看第一条规则,由于unsigned int
和int
具有相同的排名,因此无符号类型的排名大于或等于签名类型。第一条规则匹配。在添加之前,已签名的532
会转换为unsigned int
。
即使第一条规则没有匹配,添加也无法与第二条规则匹配,因为签名的int
无法代表unsigned int
的所有值。 (int
的签名unsigned int
可能与-1
相同,但例如,int
是签名unsigned int
但不是unsigned int
,因此必须至少有一个int
无法表示为已签名的{{1}}。)