[英]What cast occurs when there is a signed/unsigned mismatch?
当编译器发现签名/未签名的不匹配时,需要采取什么操作? 签名号码是否为无符号或反之? 为什么?
如果操作数是整数且有无符号值,则转换为无符号。 例如:
-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
整数,因为这会影响整数提升。 例如,如果将long int
与unsigned int
进行比较,并且long int
可以表示unsigned int
所有值,则unsigned int
将转换为long int
。 (否则,它们都只是转换为unsigned long int
。)
但是,在大多数情况下,如果发现不匹配,编译器应将有符号整数转换为无符号整数。
它可能是特定于编译器的。 如果你看一下问题“ 我应该禁用C编译器有符号/无符号不匹配警告吗? ”,你会看到,如果“litb”变量,则signed-var被“提升”为无符号值。
在任何情况下,一旦一个变量达到某个值(即,设置了最高有效位 ),编译器就没有“正确”的方法来处理这种情况。 所以,如果你有这样的警告,一定要摆脱它;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.