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

本文深入解析C++中将负数赋值给unsigned类型变量的行为,包括数学解释与计算机内部处理机制。阐述了取模运算对负数的影响及补码存储原理,解释了为何-1赋给8位unsigned char会变为255。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值