一、规则总结
1. 在c++中,如果赋值给无符号类型一个超过它表示范围的值(如负数),结果是初始值对无符号类型表示数值最大值取模后的余数。
2. 在c++中,如果表达式中同时有无符号类型和有符号类型,会默认将有符号类型转换为无符号类型进行运算,运算结果也是无符号类型。
二、以int和unsigned为例
1. 如果赋值给unsigned一个负数值,结果是什么?结果是将该负数对unsigned表示数最大值取模后的余数。
(1)unsigned表示数最大值
在大部分编译器中该类型占4个字节,则最大值是2的32次方,为4294967296。
(2)负数的取模运算
负数的取模运算和数学中的取余运算不同,区别主要体现在:取模运算商是向负的无穷大取值,而取余运算商是向0取值。举例说明:如-3对2取余商为-1,但-3对2取模商则是-2。
(3)赋值给unsigned一个负数值时实际得到的结果
上述程序的输出结果是:
结果是怎么算出来的呢?
u=-1,-1除以4294967296,商是-1,而取模后的余数是4294967296-(-1*-1)=4294967295