繁体   English   中英

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

[英]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 intunsigned int进行比较,并且long int可以表示unsigned int所有值,则unsigned int将转换为long int (否则,它们都只是转换为unsigned long int 。)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM