我似乎记得我在读
underflow
意味着你有一个太小的大小不能在类型呈现了overflow
表示您的幅度太大,无法再以某种类型显示
但是,实际上,我认为使用这些术语是为了
underflow
表示您的值太小,无法再以某种类型显示overflow
表示您的价值太大,无法再以某种类型显示
在这里使用的正确含义是什么?整数和浮点类型的术语定义是否有所不同?
我似乎记得我在读
underflow
意味着你有一个太小的大小不能在类型呈现了overflow
表示您的幅度太大,无法再以某种类型显示但是,实际上,我认为使用这些术语是为了
underflow
表示您的值太小,无法再以某种类型显示overflow
表示您的价值太大,无法再以某种类型显示在这里使用的正确含义是什么?整数和浮点类型的术语定义是否有所不同?
Answers:
在这件事上,我真的找不到“权威”资料来源,主要是因为这可能是约定俗成的问题,并且术语经常不一致。但是,Robert Seacord的“ C和C ++中的安全编码 ”的以下摘录总结了我对情况的理解:
当整数增加超过最大值或减少超过最小值3时,将发生整数溢出。整数溢出与基础表示紧密相关。
脚注继续说:
[3]将整数减至其最小值以下通常称为整数下溢,尽管从技术上讲,该术语是指浮点条件。
之所以称它为整数溢出,是因为类型中没有足够的可用空间来表示该值。从这个意义上讲,它类似于缓冲区溢出(除了实际上不跨越缓冲区边界,它通常表现出环绕行为。*)从这个角度来看,INT_MIN - 1
和之间没有概念上的区别INT_MAX + 1
。在这两种情况下,int
数据类型都根本没有足够的空间来表示这两个值-因此我们所发生的是溢出。
注意在x86和x86_64处理器体系结构中,标志寄存器包括一个溢出位也可能很有用。当有符号整数算术运算溢出时,将设置溢出位。该表达式INT_MIN - 1
将设置溢出位。(没有“下溢”位。)很明显,AMD和英特尔的工程师使用术语“上溢”来描述整数算术运算的结果,该整数运算的位数太多,无法放入数据类型,无论数值太大或太小。
*实际上,在C语言中,有符号整数溢出实际上是未定义的行为,但是在其他语言(如Java)中,两者的补码运算将环绕。
这是一个溢出。整数值不会发生下溢。
溢出是指值太大(太远,离零太远)而无法用特定类型表示,而underflwo是值太小(太接近零)。
由于最接近零的整数值(1和-1)仍可以由任何整数变量表示(假设有一个有多个位的有符号整数),因此不会发生下溢。
在上溢维基百科的文章有一个比较清楚的表述:
“术语算术下溢(或“浮点下溢”,或仅称“下溢”)是计算机程序中的一种情况,当浮点运算的真实结果的大小较小(即接近零)时,可能会发生这种情况。 “下溢部分可以看作是浮点值指数的负溢出。”
underflow
它通常专门用于指数字的大小小于可能的最小非零值但大于非零值之间的最小可能距离的特定条件。换句话说,数字落入Wiki文章所说的“下溢缺口”的情况。在符合IEEE-744的实现中,最小的可表示数量等于最小的可表示数量之差,因此不会发生下溢,但是在PC世界之外,并非所有系统都符合IEEE。
在整数数学中,溢出指的是太大或太小的值。在浮点中,上溢表示指数太大,下溢表示指数太小。
实际上,对于整数类型,CPU无法分辨出上溢和下溢之间的区别。进行以下16位添加:
0x8000 (unsigned 32768, or signed -32767)
+ 0xFFFF (unsigned 65535, or signed -1)
--------
0x7FFF (32767, the carried '1' is lost)
当然,在此添加之后,CPU中的溢出标志将被设置。使用签署数学,结果是过小(-32768)。使用无符号运算,其结果是过大(0x17FFF)。由于2的补码数学对于有符号和无符号类型是相同的,overflow
因此被迫表示太大和太小的值。
INT_MIN - 1
还是INT_MAX + 1