进制转换及数据的表示

本文详细介绍了进制概念、进制计算方法(包括查表法、短除法、位权相加法等)、有符号数与无符号数的区别、以及原码、反码、补码和移码在计算机表示有符号数中的作用。通过实例展示了不同进制间的转换策略和处理负数的技巧。

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

前言

        笔记汇总,进制的相互转换及原码、反码、补码的数据表示

目录

0.进制的概念

1.进制计算

2.有符号数和无符号数

3. 原码、反码、补码和移码


0.进制的概念

计算机采用二进制形式存储数据

二进制:由0和1两个符号组成,逢2进一

十进制:由0到9共10个符号组成,逢十进一

八进制:由0到7共8个符号组成,逢八进一

十六进制:十六个符号组成,分别是0,1,2,3,4,5,6,7,8,9,,A,B,C,D,E,F。逢十六进一

N进制的定义:由N个符号组成,逢N进一

计算机为什么采用二进制?

计算机是由许多电路组成,电路只有两种状态

1.进制计算

(1).查表法

(2).短除法

定义:当一个M进制数转N进制数时,就是用这个数除N取余,逆序排列。

具体做法:将N作为除数,用M进制整数除以N,可以得到一个商和余数;保留余数,用商继续除以N,又得到一个新的商和余数;仍然保留余数,用商继续除以N,还会得到一个新的商和余数;如此反复进行,每次都保留余数,用商接着除以N,直到商为0时为止

例:

十进制转二进制、八进制、十六进制
(1)1010--->x2
 


结果为1010--->10102
(2)10010--->x8
 


结果为10010--->1448 。
(3)10010--->x16
 


结果为10010--->6416

注:用短除法可以进行任意进制的相互转换

注:短除法特别适合十进制向二、八、十六进制的转换

(3).位权相加法

M进制转为N进制时要进行这样的运算:a*N(i-1)+aN(i-2)+...+a*N+a

例:

  • 二进制转十进制
    转换公式:a*2(i-1)+a*2(i-2)+...+a*2+a
    例:110012=1*24+1*23+0*22+0*21+1*20=(16+8+0+0+1)10=2510
  • 八进制转十进制
    转换公式:a*8(i-1)+a*8(i-2)+...+a*8+a
    例:1458=1*82+4*81+5*80=(64+32+5)10=10110
  • 十六进制转十进制
    转换公式:a*16(i-1)+a*16(i-2)+...+a*16+a
    例:14516=1*162+4*161+5*160=(256+64+5)10=32510
  • 二进制转八进制
    3位二进制数正好是一位八进制数、

从低到高,按3位一组编组,高位不够3位补0,在编组内用二进制转十进制的公式
例:110012=(011)2( 001)2=(0*22+1*21+1*20)(0*22+0*21+1*20)=318

  • 二进制转十六进制
    4位二进制数正好是一位十六进制数

从低到高,按4位一组编组,高位不够4位补0,在编组内用二进制转十进制的公式
例:110012=(0001)16( 1001)16=(0*23+0*22++0*21+1*20) (1*23+0*22++0*21+1*20)=1916

位权相加法特别适合二、八、十六进制转十进制

(4).拆位拼接法

一位八进制数等于3位二进制数,一位十六进制数等于4位二进制数

  • 八进制转二进制
    一位八进制数通过查表拆成三位二进制,然后按八进制数的高低位组合起来即可。如:
    27438---->x2
    先拆成:2 7 4 3,然后分别查表对应的二进制 010 111 100 011
    然后拼接,结果为(27438---->0101111000112

  • 十六进制转二进制
    一位十六进制数通过查表拆成四位二进制,然后按十六进制数的高低位组合起来即可。如:
    A5D616---->x2
    先拆成:A 5 D 6,然后分别查表对应的二进制 1010 0101 1101 0110
    然后拼接,结果为A5D616---->10100101110101102

(5).借桥法

对某些困难的情况,我们可以先转位十进制或二进制,然后在转为对应的进制,我成为借桥法,中间的进制就是桥。比如十六进制转八进制,我们可以先用位权相加法转为十进制,在用短除法转为八进制。

(6).总结

  • 短除法和位权相加法都能进行这四种进制的相互转换,只是在某些情况下较困难
  • 十进制转二、八、十六进制时最好用短除法
  • 二、八、十六进制转十进制时最好用位权相加法
  • 二进制转八、十六进制最好用合位法和位权相加法
  • 八、十六进制二转进制最好用拆位拼接法
  • 八进制和十六进制的互相转换最好用用借桥法

2.有符号数和无符号数

无符号数全代表正数,有符号数表示有正数和负数之分

(1).无符号数

无符号数(unsigned number) 是相对于有符号数而言的,

指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。

无符号数32位的取值范围是: 0~4294967295

注意:%u 无符号32位整数

(2).有符号数

有符号数(signed number) 和无符号数基本相同,不同的是:一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示。

有符号数32位的取值范围是: -2147483648~2147483647

在有符号数中,最高位所代表的值是- 2^ 31 ,而不是-1

注意:%d 有符号32位整数

(3). 有符号数和无符号数的区别

有符号数和无符号数的区别:

在32位编译器中,有符号数的二进制位最高位表示-2^ 31,而无符号数的二进制位最高位表示的是2^31

无论它是有符号数还是无符号数,它的二进制表示肯定都是唯一的

(不可能在有符号形式下有一种表示,在无符号形式下也有一种表示)

3. 原码、反码、补码和移码

(1). 背景

负数表示问题:

在数学中,任意基数的负数都在最前面加上“−”符号来表示。

在计算机硬件中,数字都以无符号的二进制形式表示。

但是负数如何用二进制表示呢?

解决:

通过:原码、反码、补码,用于扩展二进制数字系统,来表示有符号数。

(2). 原码、反码、补码和移码

a.什么是机器数?

机器数就是 数在计算机中的二进制表示形式。

机器数是带符号的,在计算机中用二进制数的最高位存放符号, 正数为0, 负数为1。

例如:

计算机字长为8位,则:

十进制数+3 ,转换成二进制00000011,

十进制数-3 ,转换成二进制10000011。

那么,这里的00000011和10000011就是机器数。

b.什么是真值?

真值就是真正的值。

因为二进制数的最高位是符号位,所以机器数的形式值就不等于真正的数值。

为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

即第一位用±表示数字的正负,其余为二进制数。

例如:

0000 0001的真值= +000 0001,1000 0001的真值= –000 0001。

c.原码、反码、补码和移码

原码:就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

例如:

1 的源码 0000...0001 -1的原码:1,000...0001

反码:正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反

例如: 1的反码还是1 -1的补码为1,111...1110

补码:正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1

例如:1的补码还是1 -1的补码为1,111...111

(这就解释了无符号-1 = 1111…1111 = 4294967295)

因为: 在有符号数中,最高位所代表的值是 - 231 ,而不是 -1

注:补码的补码等于原码!

移码:表示浮点数的阶码

[X]移 = 2(n-1) + X,其中-2(n-1)<X<2(n-1)

0只有一个移码,符号为1,其余为0

范围:-128~+127

正数:原码符号位变反

负数:原码同符号位一起变反,再加1

补码和移码符号位相反,数值位相同

d. -1 和 0xFFFFFFFF问题

有符号 -1 的二进制表示就是以补码形式表示,即: 0xffffffff

unsigned (-1)表示无符号整数的最大值 即: 4294967295(二进制全1)

因此,unsigned(-1)=1,111…111(共32个1)。表示unsigned的最大值。也就是0xFFFFFFFF

数据的宽度为容器的大小,它的位数代表能存储多少位的二进制数

数据溢出:所有的容器都是有一定的存储范围的,一且超出存储范围,它就会从低位到高位存储,多的含弃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值