一起学习C++:2.1计算机中的数据存储与表示

1.计算机使用二进制表示和处理数据有以下几个主要原因:

(1) 简单和可靠的电子实现:计算机内部的电子元件,如晶体管和集成电路,可以很容易地表示和处理二进制信号。它们只需要两个状态,即高电平(表示1)和低电平(表示0),这使得设计和制造电子电路变得更加简单可靠。

(2) 容易的逻辑操作:使用二进制可以进行简单的逻辑操作,如与、或和非。这些逻辑操作是计算机中基本的运算单元,能够实现复杂的计算和决策功能。

(3) 存储效率:使用二进制可以有效地存储和传输数据。每个位(比特)只有两种可能的取值,即0和1,相比于其他进制(如十进制或十六进制),二进制可以更节省存储空间和传输带宽。

(4) 数字电路的连续性和稳定性:在计算机中,电子信号的连续性和稳定性非常重要。使用二进制信号可以减少信号的失真和干扰,因为二进制信号具有明确的电压阈值来表示不同的状态,从而提高了信号的可靠性和抗干扰能力。

(5) 简化指令和编程:计算机的指令和编程语言是基于二进制的。使用二进制表示数据和指令可以简化计算机的指令集架构(ISA)和编程模型,使得计算机的设计和编程更加简单和统一。

2.计算机除了使用二进制和十进制(对于人来说易读)表示数据外,也使用八进制和十六进制来表示和处理数据,原因如下:(注意数据存储和处理是二进制的,仅仅是常用这些进制来书写表示)

#晒出今天的好天气#

(1) 更紧凑的表示:八进制(基数为8)和十六进制(基数为16)相对于二进制具有更高的进位,可以用更少的位数来表示相同的数值。例如,一个八位二进制数可以用两位的八进制或者一个位的十六进制来表示,这样可以在可读性和表示效率之间取得平衡。

(2) 方便的人类阅读和编写:相对于长串的二进制数字,八进制和十六进制提供了更方便的人类阅读和编写方式。八进制由0-7的数字表示,而十六进制由0-9和A-F的字母表示,这使得它们更易于理解和书写。

(3) 内存地址和指针表示:在计算机底层,内存地址通常以十六进制表示。使用十六进制可以更好地理解和识别内存地址、指针和寄存器等底层系统信息。

(4) 位操作和掩码运算:八进制和十六进制可以与二进制进行简单的位操作和掩码运算。这些运算在处理字节级别的数据时非常有用,比如通过移位和逻辑运算来控制和访问数据的特定位。

(5) 编程调试和调优:在编程过程中,使用八进制和十六进制可以更方便地调试和调优程序。它们可以帮助程序员快速识别和验证变量值、内存内容以及设备寄存器等信息。

3. 不同进制之间的转换

(1)十进制转化为r进制,整数部分用除r取余法,小数部分用乘r取整法,如下图十进制转化为二进制。

其他进制之间的转化

4.数据在计算机中的表示

(1)整数在计算机中的表示

由于计算机只有0和1的数据形式,因此数的正(+)、负(-)号也要用O和1编码。通常将一个数的最高二进制位定义为符号位,称为数符,用0表示正数、1表示负数,其余位表示数值。

假定一个数在机器中占用8位。

① 原码:负数原码的符号位为1(原码比二进制数据多了个符号位)

注意:这里利用原码计算(+7)+(-7)等于2了,可见用原码表示数值不合适。

② 反码:负数的反码为将原码除符号位外的所有位按位取反(正数的原码和反码一样)

注意:反码的反码是原码,这里利用反码计算(+7)(反)+(-7)(反)等于11111111(反),用原码表示为10000000(原),即-0;而利用反码计算(+0)(反)+(-0)(反)等于11111111(反),用原码表示为10000000(原),即-0。但是就算0有正负之分不应该在值为0时只得到-0,当然0不应该有正负之分的,而且0+0的值应该是确定的一个值。。

③ 补码:负数的补码为将反码加1(正数的原码和补码一样;除-128和-0外,补码求原码可以将补码减1取反或者补码取反加1)

注意: 这里利用补码计算(+7)+(-7)等于100000000,而我们这里一个整数占一个字节(8个位),多出来1位的溢出了(就是没有了),正好得到00000000(补)。因此整数无论正负都是按照补码的形式在计算机中存放的。

   例1中的结果上面已经分析过。例2中65+66的值为131超出了一个字节能表示的数值范围(-128~127),故同样的出现了内存溢出,导致了错误结果。

难点注意:10000000(补)

八位补码 10000000(补),代表的数值是:-128。

-128,有八位的补码,并没有八位的原码和反码。

因为,原码和反码的定义,都是有缺陷的:

一个数字零,它们(原码和反码)却都定义了两个编码 +0,-0!

所以,八位的原码反码,只能表示-127 ~-0 和 +0 ~ +127。

所以,八位的原码反码,都无法表示-128。

补码表示的范围是-127 ~ +127。

因此,用“取反加一”求-0 或-128 的补码,都是行不通的。

同样,用“取反加一”求补码 1000 0000 对应的原码,也是不灵的。

-------------------------

求补码的正规做法,是使用定义式:

 当 X >= 0,  [ X ]补 = X;     零和正数不用变换。

 当 X < 0,  [ X ]补 = X + 2^n。 n 是补码的位数。

这个定义式,是通用的。你可以在书上找到的。

那么,[-128]补 = -128 + 2^8 = 1000 0000 (二进制)。

所以,八位的补码 1000 0000,就是代表数值-128。

(2)浮点数(实数)在计算机中的表示

数学中的实数在计算机中称为浮点数,是指小数点不固定的数。浮点数在计算机中的表示方法比整数复杂得多。一般表示为下面的规范化数形式,其中s为0代表正数,为1代表负数。e=E+127, f为指数型记法的小数位,具体计算方法见下面的例子(这里用4个字节大小的内存存放50.0):

首先将50.0转化为二进制形式110010.0B(B是来标识数值是二进制,十进制用D,八进制用O,十六进制用H),然后按照规范化数的形式写成(-1)0 * 25 * 1.100100B(二进制的指数记法和十进制一样,小数点左移几位,位权就对应几次方),进而得到= 0 , = 5 ,

f=100100 , e=E+127 132=10000100B , 最后将s, e, f的存放在内存的对应位置,例如前23位存放f,不够23位的右侧补0;24~31位放e,不够8位的话右侧补0。

在计算机中,float和double采用的是不同的表示方法。

float:单精度浮点数。在32位(4个字节)的内存空间中,使用IEEE 754标准进行表示。其中,1位表示符号位(正负号),8位表示指数部分,23位表示尾数部分。

double:双精度浮点数。在64位(8个字节)的内存空间中,同样使用IEEE 754标准进行表示。其中,1位表示符号位,11位表示指数部分,52位表示尾数部分。

由于double使用更多的位来表示指数部分和尾数部分,因此具有更高的精度和表示范围,能够处理更大或更小的数值,并提供更高的计算精度。而float则使用较少的位数,因此具有较小的表示范围和精度。float单精度浮点型和double双精度浮点型的存储方式不同;

(3)西文字符在计算机中的表示

西文字符包含英文字符、数字、各种符号。最常用的西文字符集是美国信息交换标准代码ASCII (american standard code for information interchange)。ASCII码使用7位二进制编码,编码值从0到127,可以表示128个字符。例如下图中,H表示编码的高3位(前3位),L表示编码的低4位(后4位)。其中十进制的0~31和127属于控制字符(就是起控制作用的),其余的是图形字符(可以显示到屏幕上的),例如”0”这个字符对应的ASCII码为十进制的48,它在内存中存储的也就是48对应的二进制值,其余的数字依次加1;A的ASCII码值为65,其余大写字母依次加1;a的ASCII值为97,其余小写字母依次加1。当我们按住Alt不松,输入65,即可得到A。

https://mbd.baidu.com/newspage/data/landingshare?preview=1&pageType=1&isBdboxFrom=1&context=%7B%22nid%22%3A%22news_9507949096568715592%22%2C%22sourceFrom%22%3A%22bjh%22%7D

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬生亦东生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值