为什么使用二进制计算的时候会出现溢出现象?
发布网友
发布时间:2022-04-23 00:56
我来回答
共3个回答
热心网友
时间:2023-10-06 09:37
什么是溢出?
溢出,是指数据的大小,超出了编码所能表示的范围。
发生溢出时,该组编码,就不能正确的表示数据。
不仅是补码计算,任何形式的计算,都可能产生溢出。
比如:1999 年、2000 年 ...,这是用 4 位十进制表示。
当到了 9999 年,再过一年,你如果还用 4 位表示,就会溢出了。
如果不*编码的位数,那么,就不存在溢出的问题了。
-----------------------------
无符号数的溢出
计算机所能运算的位数是固定的,如:八位机、16、32、64 位机。
当字长为八位时,其计数范围是:0000 0000~1111 1111。
它们可以表示【自然数】,写成十进制就是:0~255。
在小学学过的【自然数】,在计算机专业,被偷改为“无符号数”。
---------------
如果在其最大值(255)再加上一,就会超出表示范围,发生溢出。
此时,八个位就都为 0,进位将为 1。
进位为 1,就是无符号数溢出的标志。
进位 1,代表十进制的 256。
256 是八位二进制数的计数周期,又被计算机专业改称为“模”。
-----------------------------
带符号数的溢出
八位二进制也能表示【整数】,包括了【正整数、零和负整数】。
在小学学过的【整数】,在计算机专业,被偷改为“带符号数”。
此时,0 ~ 127,就直接代表【零和正整数】;
128~255,是以补码代表【负整数】,即代表-128~-1。
---------------
在正数最大值(+127)上再加+1,就会超出表示范围,发生溢出。
此时得到的是 128,这是负数(-128)的补码。
注意,虽然此时的进位为 0,但是仍然是溢出了。
结果的符号错误,才是溢出的特征。
---------------
在负数最小值(-128)再加-1,也会超出范围,发生溢出。
计算如下:
1000 0000
+ 1111 1111
---------
(1) 0111 1111
此时,竟然得到了正数(+127)!
注意,此时的进位为 1,并无意义。
结果的符号错误,才是溢出的特征。
---------------
“带符号数”溢出的特征是:运算结果的符号,与正常结果相反。
“带符号数”的溢出,与进位是 1 是 0,并无关系。
---------------
判断是否溢出的方法
因为“带符号数”运算发生溢出,必定是结果超出范围。
所以,只有如下四种运算,才有可能出现溢出:
正数+正数、负数+负数、正数-负数、负数-正数。
其它运算如:正-正、...,就不必考虑溢出了。
由人工计算:就可根据数据的符号来判断,如:
正+正,出现负的结果;
负+负,出现正的结果;
... ...
发生上述四种之一,就是溢出。
另外,也可考查进位与次高位的进位,两者不同,就是溢出。
用 CPU 计算:CPU 能够自动判断,如果发生溢出则会置位 OF。
-----------------------------
热心网友
时间:2023-10-06 09:37
使用二进制计算的时候会出现溢出现象,是因为计算机都有它的上限和下限,太大的数值和太小的数值都是无法显示出来的。
计算机中用补码来表示和存储数值,而在进行数值的算术运算时由于机器字长的*往往会出现补码溢出,导致计算结果错误。
针对这个问题,提出了一种根据溢出结果得到正确结果的计算方法:
两个正数相加溢出时,将错误解加上2~(n+1)即为正确解;
两个负数相加溢出时,将错误解减去2~(n+1)即为正确解。
热心网友
时间:2023-10-06 09:38
溢出,是指数据的大小,超出了编码所能表示的范围。
不仅是二进制,任何进制的计算,都可能产生溢出。
比如:1999 年、2000 年 ...,这是用四位十进制表示。
当到了 9999 年,再过一年,你如果还用四位表示,这就溢出了。
字长为 8 位二进制,补码的范围是-128 至+127。
那么,+125 + 4 = +129,这就溢出了。
为什么使用二进制计算的时候会出现溢出现象?
使用二进制计算的时候会出现溢出现象,是因为计算机都有它的上限和下限,太大的数值和太小的数值都是无法显示出来的。计算机中用补码来表示和存储数值,而在进行数值的算术运算时由于机器字长的限制往往会出现补码溢出,导致计算结果错误。针对这个问题,提出了一种根据溢出结果得到正确结果的计算方法:两个正数...
二进制 溢出问题
计算错误,溢出分上溢和下溢。两个大数相加得出的书比任何一个数都小,这就是上溢!这个跟你的寄存器的大小有关系,比如说你的寄存器大小是-9999到9999,你计算8888+2222正确结果是10000,但是结果超出寄存器的有效数了,当然移位器就会在右移操作中把1移掉了(为了便于理解,我这把计算机的计算都认为...
二进制补码计算,关于溢出的问题!
溢出,一般来说,就是指“容器太小”。无论什么进制,都有可能会溢出。比如说,电话号码,由 7 位,升到 8 位,这是为什么呢?就是因为 7 位,容纳不了那么多的号码,不升位,将会发生溢出。计算机领域中的溢出,是指数据大小,超出了计数编码所能表示的范围。早期的计算机,年份,是以两位数来...
什么是溢出,为什么会有溢出现象呢?
计算机在运算中产生溢出的原因主要是因为计算机所使用的存储空间有限,即使对于最高位的数值也只能用固定位数的二进制数字表示。因此,当一个数的值超过了所分配的位数时,就会发生溢出现象。具体地说,整数加法中溢出的发生主要取决于两个数的符号和它们相加后的符号。如果两个数的符号相同而相加后的结果...
二进制的溢出问题
以8位的数字为例,记最右边的那位数为第0位,有符号数加减的溢出取决于8位的数字和第7位(即最高位左边那一位和最高位)这两个数字是否相同,若相同则没有溢出,若不同则溢出。无符号数加减则是有进位就算溢出了。至于后面那个,算有符号,结果为-1,没有溢出。
用二进制补码计算(-83)+(-82),如果出现错误,请说明原因。
8位二进制有符号数补码表示的范围是-128-+127,(-83)+(-82)超出了其能表示的范围,所以出现溢出,计算结果出错。
急求:溢出问题
用int 溢出,说明你的编译器里面int是16位的,即2个字节.最高位是符号位.那么表示的最大范围是-32768~32767 而50*50*50在运算的时候,会不断的进位,导致最高位符号位变成非0.这个时候正数就变成了负数,产生了那样的结果.溢出的结果也不是随机的,而是如果计算的结果的二进制码超过了它的长度(比如你...
为什么溢出?
这是因为 long 和 double 的表示范围不同,表达式是先计算 c*789, c 是 long int 类型, 789 编译器默认使用 int 的类型, long int * int, 结果结果会用 long int 类型的编译器中间变量来存储, 这个结果再赋值给 double 类型变量 f, 溢出是在计算 466438237*789 时发生的 表达式 (double...
负溢是什么
在计算机系统中,负溢一般指的是数据或计算结果超出了其可表示的范围而导致的溢出现象。在数值计算过程中,特别是在进行算术运算时,如果被处理的数据超出了数据类型能够表示的最大值或最小值范围,就会发生溢出现象。在二进制运算中,当正数进行加法运算或负数进行减法运算的结果超出了该数值类型所能表示的...
两个补码数相加只有在什么时有可能产生溢出
2. 当两个补码表示的数相加结果超出了所使用的数据类型的范围时,也可能产生溢出。这是因为不同的数据类型有不同的取值范围,如果相加的结果超出了该数据类型的范围,就会产生溢出。在实际内容中,如果使用二进制补码表示法进行计算,那么必须考虑到计算机所能表示的最大正整数和最小正整数以及所使用的...