unsigned int i=3;为什么cout<<i * -1<<endl;结果是4294967293


unsigned int i=3;为什么cout<<i * -1<<endl;结果是4294967293
unsigned int的值域是 0 --- 4294967295
如果是有符号int的话,值域是 -2147483648 --- 2147483647
两个值域的个数(数学里称集合的基)都是4294967296个

0 --- 4294967295 = [0 2147483647] U [2147483648 4294967295]
unsigned int 和 int的公共区域是 0 --- 2147483647

有符号int的[-2147483648 -1] 对应于 unsigned int的[2147483648 4294967295]区域, 两个区域的值是一一扮基绝对应的(数学上称为双射).
所以, -1 对应 4294967295, -2 对应 4294967294, -3 对应 4294967293, ....

所以你的 3 * -1 = -3, 于是就等于无锋锋符号int 的 4294967293了厅姿。
这里涉及到数的计算机表示,符号扩充与C中数据类型转化的问题.
数在计算机中用二进制表示,符号放在最高位,正号用0表示,负号用1表示.如3在计算机内的补码形式为0101,-3为1101.关于原码与被码,这里不细讲了.
在C中,int型数据占用4字节内存.由于1101(即-3)不够32位,故左边要进行符号扩充,变为这亩带念里涉及到数的计算机表示,符号扩充与C中数据类型转化的问题.
数在计算机中用二进制表示,符号放在最高位,正号用0表示,负号用行滑1表示.如3在计算机内的形式为0,-3为11111111111111111111111111111101.
如果按整型输出迅困,则输出为-3.但是i为unsigned型,i与(-1)相乘,结果仍为unsigned型.意谓着最高位的1也不再是符号了,而是表示数了.这就是-3变4294967293的原因.