签名/未签名不匹配时会发生什么演员?

时间:2009-05-08 07:38:11

标签: c++ casting warnings

当编译器发现签名/无符号不匹配时,需要采取什么操作?签名号码是否为无符号或反之?为什么?

3 个答案:

答案 0 :(得分: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

转换无符号int-> int是:n< = INT_MAX - > N; n> INT_MAX - >实施定义

  

如果目标类型未签名,   结果值最小   无符号整数与。一致   源整数(模2 ^ n,其中n是   用于表示的位数   无符号类型)。

     

如果目的地类型已签名,则   如果可以,则值不变   以目的地类型表示   (和位域宽度);否则,   值是实现定义的。

答案 1 :(得分:1)

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

  

转换规则更复杂   何时涉及unsigned个操作数。   问题是比较   有符号和无符号值之间是   机器依赖,因为他们依赖   关于各种整数的大小   类型。 (K&安培; R)

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

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

答案 2 :(得分:0)

它可能是特定于编译器的。 如果您查看问题“Should I disable the C compiler signed/unsigned mismatch warning?”,您会看到,如果“litb”变量,则signed-var被“提升”为无符号值。

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