源码,反码和补码https://mp.csdn.net/mp_blog/manage/traffic

一,有符号数和无符号数

1.有符号数:正数,0,负数。

(signed)int,(signed)char,其中signed可省略不写。

2.无符号数:正数,0。signed

unsigned int ,unsigned char。

二,8bit数据的存储

char,有符号类型,在内存中占一个字节(一个字节等于8位),可以表示负数,0,正数。表示的数据[-128~127].


unsigned char ,无符号类型,在内存中占1个字节。可以表示0,正数。表示的数据范围[0~255].

三,源码,反码和补码

无符号类型的数:源码,反码和补码都相同

eg.1

十进制的10,转化为二进制为

源码:00000000 00000000 00000000 00001010

反码:00000000 00000000 00000000 00001010

补码:00000000 00000000 00000000 00001010

有符号类型的负数:源码转化,反码除符号位取反,补码反码加一;

有符号类型的正数:原码=反码=补码。

eg.2

十进制的-10,转化为二进制为

源码:10000000 00000000 00000000 00001010

反码:11111111 11111111 11111111 11110101//符号位不变,其他位取反

补码:11111111 11111111 11111111 11110100 ​​​​​//在反码基础上加一

超出范围数据的计算方法

超出范围数据的计算方法先计算整数的补码(=右边的数)把补码赋值给变量,

然后观察变量的数据类型, 若是为unsinged char类型,一定为正数或0,原,反,补一样.

%d输出的原码就是补码,直接转换为元素输出即可。

若是为char类型,观察变量内存存储数据的最高位,1 表示为负数,%d输出需要转换为原码输出。

eg.3

char a=200;

//200的原码:00000000 00000000 00000000 11001000

//200的反码:00000000 00000000 00000000 11001000

//200的补码:00000000 00000000 00000000 11001000

因为char占一个字节,即占二进制的8位数,所以进行赋值时,将11001000赋给变量a。

 这样以来,首位就变成了1,而有符号类型的数中,首位1表示负数。

在计算机的二进制中,存储到计算机的二进制是这个数的补码。

所以我们还需要进行转换。

转换如下:

a的补码:11001000

a的反码:11000111

a的原码:   10111000

原码进行加权运算:-(1*2^5+1*2^4+1*2^3)=-56;

故char类型的a=-56;

是不是很神奇。

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值