如何判断整数是否溢出
发布网友
发布时间:2022-05-03 02:24
我来回答
共3个回答
热心网友
时间:2023-10-06 00:26
根据存储的空间和有无符号位。
例如c或java当中的int型,使用32位,4个字节存储,有符号位。其能存储2^32种不同数据。可存储的数据在-2^31~2^31-1这个范围内,超出则范围则溢出。
若使用不带符号位,则范围为0~2^32-1。
用更加简单的例子,如果使用4位来存储,只能存储2^4=16种不同数据。如果不带符号位,则存储范围为0~15,超出则溢出。如果带符号位,则范围为-8~7,超出则溢出。
在实际编程中,某些编译器会在特定情况下提示溢出问题,但更多情况需要自己处理溢出问题。
有什么具体需求可以在追问中提出。
热心网友
时间:2023-10-06 00:27
计算机中的溢出,是指数据过大,超出了预定的范围。
八位二进制,可以代表自然数:0~255;
也可以代表整数:-128~+127。
判断溢出,常用的方法:
1。你用十进制,人工计算。和,在容许范围之内,就没有溢出。
这种方法最简单。而且,对无符号数、带符号数,都是适用的。
2。你用二进制,人工计算。和的符号,属于合理,就没有溢出。
这种方法稍稍麻烦。只能判断“带符号数”的溢出。
3。你编个程,让 CPU 计算。如果 OF = 0,就没有溢出。
这种方法,难度较大。
4。你把两个数据,显示出来,求大家帮你判断。
在你那边,通网络了吧。
热心网友
时间:2023-10-06 00:27
C语言中存在两类整数算术运算,有符号运算和无符号运算。在无符号运算里,没有了符号位,所以是没有溢出的概念的。
所有的无符号运算都是以2的n次方为模。如果算术运算符的一个操作数是有符号书,另一个是无符号数,那么有符号数
会被转换为无符号数(表示范围小的总是被转换为表示范围大的),那么溢出也不会发生。但是,当两个操作数都是有符号数
时,溢出就有可能发生。而且溢出的结果是未定义的。当一个运算的结果发生溢出时,任何假设都是不安全的。
例如,假定a和b是两个非负的整型变量(有符号),我们需要检查a+b是否溢出,一种想当然的方式是:
if
(a
+
b
<
0)
溢出;
实际上,在现实世界里,这并不能正常运行。当a+b确实发生溢出时,所有关于结果如何的假设均不可靠。比如,在某些
机器的cpu,加法运算将设置一个内部寄存器为四种状态:正,负,零和溢出。在这种机器上,c编译器完全有理由实现以上
的例子,使得a+b返回的不是负,而是这个内存寄存器的溢出状态。显然,if的判断会失败。
一种正确的方式是将a和b都强制转换为无符号整数:
if
(
(unsigned)a
+
(unsigned)b
>
INT_MAX)
溢出;
这里的int_max值为有符号整型的最大值。在一般的编译器里是一个预定义的常量。ANSI
C在limits里定义了INT_MAX,值为
2的31次方-1.
不需要用到无符号算数运算的另一种可行方法是:
if
(a
>
INT_MAX
-
b
)
溢出;
PS
:
有符号数的最高位(31位)为符号位,最高位为0的时候,表示正,为1的时候表示负。运算时,符号位不参加运算,但是如果两个数相加,30位需要进1时,那么即表示溢出。