原码、补码说明以及char和unsigned char区别--中间版

0、

原码、补码(以及反码)这些概念都是对整数而言的,即原码、补码所表示的实际数值都是整数。而对实数(即带有小数点的数值,如5.0,,5.5)而言,是没有原码、补码(以及反码)这些概念的,即实数不能用原码、补码来表示。

原码,对应表示的是整数中的正整数部分;补码,对应表示的是整数中的负整数部分。



0,无论用原码还是补码表示,其值都是为0(即其原码值为0,其补码值也为0)。

对应能表示整数的数据类型: Int 、char等。

对应能表示实数的数据类型: float 、double等。

1、

反码:即对原码的各位取反所得的结果。

补码=反码+1。

注释:

补码的一个规定是补码的最高位要为1。故而作为补码的二进制数值的最高位必为1,最高位为1的二进制数值,我们可以视其为补码,也可以视其为原码。

通过上述这个从原码到补码的转换的方法,所得的值不一定是补码(即所得的二进制数值的最高位不一定为1),当原码(值所要存储的变量)为n位,补码(值所要存储的变量)也为n位,且原码最高位为1时,所得的n位补码的最高位一般不为1,即不是补码。上述方法能取的补码的前提是补码(值所要存储的变量)所要存储的位数要比原码(值所要存储的变量)的位数(至少)多一位,这个相当于说,补码(值所要存储的变量)所要存储的位数和原码(值所要存储的变量)的位数可以一样,但是原码(值所要存储的变量)的位数中从左向右数(连续的至少)一位是始终只能置为0的。

若我们要求的一个负整数a的补码的位数是n位的话,则该负整数a对应的正整数|a|的原码只能用n-1位(也就是说n位的补码只能表示2的n-1次方个负整数),这样就保证在原码取补码时最高位为1,而这个最高位我们就称其为符号位了。

2、

负数经过补码算法后所得的补码的最高位必然为1的。

对于一个变量的二进制值是视作原码还是视作补码,取决于变量的数据类型是有符号的(signed),还是无符号的(unsigned):

2).1

对于一个变量(如Int iR;)的二进制值的最高位为0的,

无论变量的数据类型是有符号的(signed),还是无符号的(unsigned),二进制值必然都是一个原码值。

2).2

对于一个变量的二进制值的最高位为1的,

如果该变量的数据类型是有符号的(signed),则二进制值必然都是一个补码值。
如果该变量的数据类型无符号的(unsigned,则该二进制值必然都是一个原码值。

3、

因为char类型的变量的最高位用于做符号位,不做数据位,所以char类型的变量的最高位为0的表示是正整数(也就是原码),char类型的变量的最高位为1的表示是负整数(也就是补码)。也就是说,char类型的变量的数据位为7位,故而char 表示的整数范围为-127~127。

因为unsigned char类型的变量的最高位不用于做符号位,还是做数据位,所以unsigned char类型的变量的最高位无论是为0还是为1的都是表示正整数(也就是原码)。也就是说,unsigned char类型的变量的数据位为8位,故而unsigned char 表示的整数范围为0~255。

注释:

char类型的变量的最高位为1,不是我们人为的置为1(即例如,-5的补码值为补码最高位置为1,补码数据位置为5的原码值),而是负数经过补码算法后最高位必然为1的。

所以,补码的一属性必然是有符号的(signed),不可能是无符号的(unsigned)。

4、

补码和补码,补码和原码间的运算前提是要先给补码原码确定存放其的变量的数据类型,只有数据类型相同的补码和补码,补码和原码间才可以直接运算:

原码、补码(以及反码)这些概念都是有一个修饰条件的,即几位的原码、几位的补码。例如,8bit原码,8bit补码,32bit的原码32bit补码原码、补码(以及反码)这些概念的另一个修饰条件是该原码、补码是有符号的(signed),还是无符号的(unsigned)。其实,确定这两点相当于确定一个具体数据类型(的变量)来存放这些原码、补码值。例如,unsigned char类型的变量,只可以用于存储8bit无符号的(unsigned原码,而 char类型的变量,可以用于存储8bit的有符号的(signed原码(符号的,意味着其数据位为7bit)和8bit的有符号的(signed)补码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值