4

当编译器发现有符号/无符号不匹配时,它会采取什么行动?有符号数是否转换为无符号数,反之亦然?为什么?

4

3 回答 3

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 是用于表示无符号类型的位数)。

如果目标类型是有符号的,则如果它可以在目标类型(和位域宽度)中表示,则该值不变;否则,该值是实现定义的。

于 2009-05-08T08:04:31.073 回答
1

我不认为 C++ 偏离了 C 处理有符号/无符号转换的方式:

unsigned当涉及操作数时,转换规则更加复杂。问题是有符号值和无符号值之间的比较取决于机器,因为它们取决于各种整数类型的大小。(K&R)

要考虑的一个重要因素是其中一种类型是否为long整数,因为这会影响整数提升。例如,如果将 a 与 along int进行比较unsigned int,并且 along int可以表示 a 的所有值unsigned intunsigned int则将转换为 a long int。(否则,它们都只是转换为unsigned long int.)

但是,在大多数情况下,如果编译器发现不匹配,它应该将有符号整数转换为无符号整数。

于 2009-05-08T08:08:48.863 回答
0

它可能是特定于编译器的。如果您查看问题“我应该禁用 C 编译器有符号/无符号不匹配警告吗? ”您会看到在“litb”的情况下,有符号变量“提升”为无符号值。

无论如何,一旦一个变量达到某个值(即设置了最高有效位),编译器就没有“正确”的方法来处理这种情况。所以,如果你有这样的警告,一定要摆脱它;)

于 2009-05-08T07:47:15.033 回答