计算机里存储的数据有无符号,计算机对数据的处理为什么有大小限制呢?

本文详细解释了计算机中数据的存储方式,包括数据宽度的概念,有符号数和无符号数的区别,以及不同宽度的数据能表示的数值范围。讨论了数据溢出现象,并介绍了计算机常用的数据容器类型,如字节、字、双字和四字。此外,还提到了进制符号和容器的界限对数值计算的影响。
摘要由CSDN通过智能技术生成

我们知道计算机有16位,32位,64位的说法,理解计算机对数据是怎样存储的就会明白怎么回事了。下面我来详细解释一下吧。可能会比较绕,需要好好琢磨一下了。

计算机对数据的处理是有大小限制的。

必须掌握的知识点:

1、数据宽度

2、 理解有符号数、无符号数

3、进制的符号

4、容器的种类

在计算机的世界里,保存在磁盘上的数据,无论是电影、还是音乐,还是可执行程序都是由0和1组成的,这些用磁盘保存的数据它可以是任意大小的数据吗?这些数据又是如何运算呢?

【数据宽度的定义】

数学上的数字,是没有大小限制的,我们可以使用正无穷负无穷。但是计算机由于受到硬件的制约,所以不能够随心所欲地保存数据,而是有所限制,而且计算机做运算是依靠电路的变化来实现的,所以和我们数学中计算有很大的差异。

从思维上最主要的差异是:数学计算不需要存储,我们用笔、也可以在脑中思考就能得出它的结果。而计算机做运算,首先要将这些数值存储在计算机中,用来存储这些数据的地方我们称为“内存”。当有很多数据存储在计算机中时,如何区分每一个数据呢?

例如:内存上有一组数字:

0011000000111110101010100100010010001000011110101001010101010011

你能知道上面的电路(数字)中存储了哪些数值吗?当然不能!即不知道它存储了多少数字,也不知道每个数字有多大。如果告诉你每16位为一个数据呢,你是不是就能知道上面的电路表示为哪些数值了?我们把每16位数分为一段,一共存储了4个数,它们的数值如下:

0011000000111110

1010101001000100

1000100001111010

1001010101010011

当然计算机不会依次数过去,每16位截取一下。这里想象为一个个容器,每一个容器里面装16位。

0011000000111110 1010101001000100 1000100001111010 1001010101010011

把数据存储在容器中,当计算机需要做运算时,从容器中读取数据到其他的地方就很方便了。

16位二进制能表达的无符号整数的范围是0至216-1即0~65535,假如我们需要存储一个人的年龄,最多120岁,转换为二进制为1111000(7位),16位太浪费了;假如我们要存储一个很大的数,16位不一定够用。所以我们可以根据需要去选择相关大小的容器,如何描述容器的大小呢?

容器的大小就是“数据宽度”,代表它能存储几位二进制数。

假设有一个容器的数据宽度是4位,它能存储的数据如下:

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

【有符号数和无符号数】

数学中的数据分为正数和负数,在计算机中我们分为无符号数和有符号数,无符号数表示全是正数,有符号数表示有正数和负数。这里好比将容器贴个标签,将它贴上“无符号数”的标签,那么它里面都是正数。如果它的标签是“有符号数”,那么它里面的数据可能是正数也是负数。它里面的电路数量是一定的,它能表示的开关组合也是一定的,那么它到底是按无符号数看还是有符号数看,关键在于它标签是什么。

例1:数据宽度为4位的容器能存储的数据转换为十六进制为“0~F”,那么它们是如何表示为有符号数、无符号数的呢?

0ca943dfa7b72663540ea8c2c28f9ea5.png图1-4-1: 4位宽度数据存储

无符号数表示范围:0 1 2 3 4 5 6 7 8 9 A B C D E F,箭头方向表示增加方向

有符号数:

正数表示范围:0 1 2 3 4 5 6 7

负数表示范围:-1 -2 -3 -4 -5 -6 -7 -8(从半圆F起到8,所以F表示-1,8表示-8)

无符号数不难理解,而有符号数则是从中间一分为二,左边为负数,右边为正数。同一个圆把它看成无符号数它是一个正数,如果把它看成是有符号数则是有正有负。比如F,它如果是无符号数,就是15,如果是有符号数它就是-1。

例2:我们再来看一下数据宽度为8位的数据储存情况,如图1-4-2所示:

6abcd61abdc7bf717df93158363e74e3.png图1-4-2:8位宽度数据存储

注释:4位宽度我们用1位十六进制表示,那么8位宽度就是2位十六进制。

无符号数的储存范围:0 1 2 3 ...FF。

我们用十进制来验证一下这个结果,8位2进制(相当于8条线,每一条线有通电和不通电两种情况),那它有28个,结果为256,我们将FF转化为十进制结果也是256。

有符号数储存范围:

正数:0 1 2 ...7F

负数:80 81 …FF

我们习惯使用十进制,很多书中在讲数据的存储范围的时候也是使用10进制,我们将上述有符号数转换为10进制,结果为-128~127。所以宽度为8位能存储的数据范围为:-128~127。

在我们程序中所看到内存的数据都是十六进制的,如果遇到有符号数,大家看到高位大于等于8的数就能想到它是负数。

例3、同样我们来看一下数据宽度为16位的数据存储情况,如图1-4-3所示:

effd0b8bc69fa4ac1eeb0bd5ee4bef95.png图1-4-3:16位宽度数据存储

无符号数的存储范围:0~FFFF,转换为10进制范围为:(0 ~ 216 - 1)。

有符号数存储范围(8000~7FFF)

正数:0 ~7FFF

负数:-8000 ~FFFFF(-1)

例4、数据宽度为32位的数据存储情况,如图1-4-4所示:

7928581a7585ec3023c5764c058e6e75.png图1-4-4:32位宽度数据存储

无符号数的存储范围:0~FF FF FF FF,转换为10进制范围为:(0 ~ 232 - 1)。

有符号数存储范围(80 00 00 00 ~ 7F FF FF FF)

正数:0 ~7F FF FF FF

负数:-80 00 00 00 ~ FF FF FF FF(-1)

宽度为32位是我们使用频率较多的一个容器,我们后面所学的寄存器就是32位。

总结:从计算机的角度来看,它并不区分什么是有符号数什么是无符号数,它只管存,但它最终表示的数值是我们如何定义和使用。

【数据溢出】

所有的容器都是有界限的,一旦超出它的存储范围,它会从低位到高位存储,多余的会舍弃。

在计算机中,在对数值进行运算前要先规定其宽度,再进行运算。如果运算结果超过其宽度将被丢弃,只保留有效位。

例如:用32位宽度的容器计算无符号数FFFF FFFF+1=?因为该容器只能存储8位十六进制的数,而FFFF FFFF+1会进位变成9位十六进制数,等于1 0000 0000。这时候容器会舍掉高位,为8个0。图1-4-4中更形象地表示了这个结果:从0开始沿着箭头方向是增加的,FFFFFFFF的下个数为是0。

如果把FFFF FFFF看成有符号数,即为-1,-1+1 = 0,图1-4-4中FFFFFFFF的下个数为0。所以数据是无符号数还是有符号数关键在于我们怎么看,和计算机没有关系。

【进制的符号】

十六进制符号用字母“0x”表示,如0xF8;二进制符号用“B”表示,如果11B。

【容器的种类】

我们虽然可以根据数据的大小选择容器的宽度,但这并不是随意。计算机为我们提供四种单位的容器:

①字节(BYTE):数据宽度为8位;

②字(WORD):数据宽度为16位;

③双字(Doubleword,简写:DWORD):数据宽度为32位;

④ 四字(Quadword):数据宽度为64位。

图1-4-5显示了计算机常用的数值宽度,它们的高低位分布如图所示:

9f91aad19eb633a6a3b5719a87a84776.png图1-4-5 计算机数值宽度

目前计算机中没有数据宽度为4位的容器,我们仅用它来抛砖引玉。

举报/反馈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值