当编译器发现有符号/无符号不匹配时,它会采取什么行动?有符号数是否转换为无符号数,反之亦然?为什么?
3 回答
如果操作数是整数并且存在无符号值,则完成到无符号的转换。例如:
-1 > (unsigned int)1 // as -1 will be converted to 2^nbits-1
转换 int->unsigned int 为:n>=0 -> n; n<0 -> n (mod 2^nbits),例如 -1 到 2^nbits-1
转换 unsigned int->int 为:n <= INT_MAX -> n; n > INT_MAX -> 实现定义
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2^n,其中 n 是用于表示无符号类型的位数)。
如果目标类型是有符号的,则如果它可以在目标类型(和位域宽度)中表示,则该值不变;否则,该值是实现定义的。
我不认为 C++ 偏离了 C 处理有符号/无符号转换的方式:
unsigned
当涉及操作数时,转换规则更加复杂。问题是有符号值和无符号值之间的比较取决于机器,因为它们取决于各种整数类型的大小。(K&R)
要考虑的一个重要因素是其中一种类型是否为long
整数,因为这会影响整数提升。例如,如果将 a 与 along int
进行比较unsigned int
,并且 along int
可以表示 a 的所有值unsigned int
,unsigned int
则将转换为 a long int
。(否则,它们都只是转换为unsigned long int
.)
但是,在大多数情况下,如果编译器发现不匹配,它应该将有符号整数转换为无符号整数。
它可能是特定于编译器的。如果您查看问题“我应该禁用 C 编译器有符号/无符号不匹配警告吗? ”您会看到在“litb”的情况下,有符号变量“提升”为无符号值。
无论如何,一旦一个变量达到某个值(即设置了最高有效位),编译器就没有“正确”的方法来处理这种情况。所以,如果你有这样的警告,一定要摆脱它;)