C++中的无符号数和有符号数

C++中的无符号数和有符号数

一、问题引入
# include <iostream>
using namespace std;

int main(){
    short unsigned int a;
    short int b;
    b = -10;
    a = b;
    cout << a << ' ' << b;
    return 0;
}

运行结果:

65526 -10
二、原因分析

b作为一个有符号数,这里将其赋值为-10,在计算机中有符号数以补码的形式进行存储

-10的原码表示为:1000 0000 000 1010,补码表示为:1111 1111 1111 0110;

tips:补码速算方法

正数的补码反码和原码相同;

负数的补码:从最低为开始第一个遇到的1不变,符号位不变,其余的取反(1变成0,0变成1);

这里将无符号数a赋值为b,由于无符号数在计算机中就是以二进制原码的方式进行存储,所以a的二进制为1111 1111 1111 0111 = 216-1-23-2^0 =65526

三、为什么要引入反码和补码?

因为计算机中只有加法器,需要把减法运算转换为加法运算,如3-5,如果用原码计算:

(0000 0000 0000 0011)+(1000 0000 0000 0101)= 1000 0000 0000 1000 = -8;

这样显然是错误的;

引入反码后,3 的反码为0000 0000 0000 0011,-5的反码为1111 1111 1111 1010,如果用反码计算:(0000 0000 0000 0011)+(1111 1111 1111 1010)= 1111 1111 1111 1101,其结果对应的原码为:1000 0000 0000 0010 = -2,结果是对的,但是还要考虑到一个问题,如果用反码,会存在+0和-0,+0的反码为0000 0000 0000 0000 ,-0的反码为1111 1111 1111 1111,所以引入补码;

引入补码后,3的补码为0000 0000 0000 0011,-5的补码为1111 1111 1111 1011,如果用补码计算:(0000 0000 0000 0011)+(1111 1111 1111 1011)= 1111 1111 1111 1110,其结果对应的原码为:1000 0000 0000 0010=-2,结果是对的,而且0的补码表示为0000 0000 0000 0000,只有这一个补码可以表示0,解决了反码中有两个值表示0的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值