C++开始: 赋值给一个无符号类型的

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 :"<
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

你可能感兴趣的:(C++第二章,C++)