当编译器发现签名/无符号不匹配时,需要采取什么操作?签名号码是否为无符号或反之?为什么?
答案 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 int
与unsigned 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的位置),编译器就没有“正确”的方法来处理这种情况。 所以,如果你有这样的警告,一定要摆脱它;)