当运算表达式中存在有符号数和无符号数时,补码不变,有符号数变成无符号数的解释

一.原码、反码与补码

1.原码

以最高位表示符号,其余位表示数值。例如,8位二进制数中,最高位为符号位,0表示正数,1表示负数。对于整数-5,5的二进制为0000 0101,符号位为1,其8位原码表示为10000101,-3的八位原码:10000011,-20的八位原码10010100。在原码表示中,负数的数值与正数不同,而符号位又会影响到算数运算的正确性。

2.反码

反码是一种最早的有符号整数的表示方法,它的基本思想是用二进制表示数值的同时,用最高位表示符号位,0表示正数,1表示负数。在反码中,正数的反码和原码相同,而负数的反码则是将原码中除符号位以外的各个位取反,即1变成0,0变成1。

例如,一个8位的有符号数,如果它的原码为10110110,那么它的符号位为1,表示负数,其反码为11001001。

3.补码

补码是对反码的改进,其基本思想是将负数的表示方式从原来的取反变成取反后再加1。在补码中,正数的补码和原码相同,而负数的补码是将原码中除符号位以外的各个位取反,然后再加1。

例如,一个8位的有符号数,如果它的原码为10110110,那么它的符号位为1,表示负数,其补码为11001010。

补码的优点在于它可以通过加法器来实现减法运算,因为减法可以转化为加法,而负数的补码正好可以满足这种加法器的要求。因此,在计算机中,通常采用补码来表示有符号整数。

需要注意的是,在补码中,最小的负数(在8位中为1000 0000,1为符号位,最小的负数为1000 0000=128)的补码无法用原码表示,因为最小的负数的绝对值比最大的正数(符号位为0,最大的正数为0111 1111-1=128-1=127)的绝对值大1。因此,计算机中通常规定,一个n位二进制数的补码表示范围为-2^(n-1)到2^(n-1)-1,其中最小的负数的绝对值为2^(n-1)。

4.例子

(1)原码转反码

例如,一个8位的有符号数,如果它的原码为10110110,那么它的符号位为1,表示负数。它的反码为将除符号位以外的各个位取反,即11001001。

(2)原码转补码

例如,一个8位的有符号数,如果它的原码为10110110,那么它的符号位为1,表示负数。它的补码为将原码中除符号位以外的各个位取反,即11001001,然后再加1,即11001010。

(3)反码转原码

例如,一个8位的有符号数,如果它的反码为11001001,那么它的符号位为1,表示负数。将其转换为原码时,需要将符号位不变,将除符号位以外的各个位取反,即10110110。

(4)补码转原码

例如,一个8位的有符号数,如果它的补码为11001010,那么它的符号位为1,表示负数。将其转换为原码时,需要将其减1,即11001001,然后再将除符号位以外的各个位取反,即10110110。

需要注意的是,在实际编程中,计算机会根据数据类型的定义来使用相应的编码方式,开发者无需手动进行转换。

二、运算表达式中同时存在有符号数和无符号数

在一个运算表达式中,如果同时存在有符号数和无符号数,则会按照如下规则进行类型转换:

  1. 如果有符号数和无符号数的类型相同,那么无需转换,可以直接进行运算。

  2. 如果有符号数和无符号数的类型不同,那么有符号数会被转换成无符号数,有符号数转为无符号数的方法:有符号数+无符号数的模。

对于有符号数转换成无符号数,如果有符号数是正数,那么它的补码就是它的二进制表示;如果有符号数是负数,那么它的补码是它的绝对值的二进制表示取反再加1。需要注意的是,当有符号数被转换成无符号数时,如果它的值是负数,那么结果会变成一个非常大的正数,这是因为在无符号数中没有负数的概念,所有的位都被用来表示非负整数,因此将有符号数转换成无符号数时需要谨慎处理。

以下是一些例子来说明有符号数转换成无符号数的过程:

  1. 有符号数为-3,转换成8位无符号数-3的补码为11111101,将其转换成无符号数时,需要将补码看作无符号数,即 11111101 = 253,因此-3转换成8位无符号数的结果为253。
  2. 2 有符号数为127,转换成8位无符号数127的补码为01111111,将其转换成无符号数时,补码不变,即 01111111 = 127,因此127转换成8位无符号数的结果为127。
  3.                                       有符号数为-128,转换成8位无符号数-128的补码为10000000,将其转换成无符号数时,需要先将补码看作有符号数,即 -128 = 2^7 = 128,然后再将其转换成无符号数,即 128 = 0,因此-128转换成8位无符号数的结果为0。需要注意的是,在将有符号数转换成无符号数时,需要根据数据类型的位数选择适当的范围,避免出现溢出等问题。

关于有符号数和无符号数的转换

(1)补码

20的二进制为

 

取反加1后补码为

转换成无符号数为

 (2)有符号数+无符号数的模

          加2^n(n位),-20+2^32=-20+4294967296=4294967276

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值