C++中,把负值赋给unsigned 对象是完全合法的,其结果是初始值对无符号类型表示数值总数取模后的余数。所以,如果把-1赋给8位的unsigned char,那么结果是255,因为255是-1对256求模后的值。
1.从数学角度解读:
取模运算时,对于负数,应该加上被除数的整数倍,使结果大于或等于0之后,再进行运算.
也就是:(-1)%256 = (-1+256)%256=255%256=255
2.计算机存储角度:
计算机中负数是以补码形式存储的,-1的补码11111111,转换成无符号数即是255的二进制编码。
unsigned char uc; //声明一个无符号的字符,8位的,无符号字符类型的取值个数为256。
uc=-1; //将-1赋给无符号的字符型对象(变量),
//此过程会先将-1自动转换为无符号数,即 11111111 11111111,然后赋值给uc
//但是uc只有8位,所以只保存了 11111111 11111111 的低8位数据,其它的位
//就因为溢出而丢失了。-----因为溢出而丢失了其它位,就相当于取模运算了。
cout<<"uc as int is :"<<int(uc)<<endl; //这一行将uc转换为整型输出,结果为255
//注意,11111111 11111111 是十六位的,但实际上也可能是32位的,因为我们现在的计算机都是32位的了。
``
unsigned u1 = 42, u2 = 10, uu1 = 10, uu2 = 42 , i1 = -10;
int i = - 10, i2 = 42;
u1 = -42;
u2 = -32;
cout << u1 << endl;
cout << u2 << endl;
cout << uu2 - uu1 << endl;
cout << uu1 - uu2 << endl;
cout << i1 << endl;
cout << i - uu1 << endl;
cout << uu1 - i << endl;
//结果 :无符号数和int运算,应该是先判断输出结果,如果为正,则int不用转换,若为负,则int转换为无符号数
4294967254
4294967264
32
4294967264
4294967286
4294967276
20