整数溢出机制 C

简介: 整数溢出机制 C

前言

这是在写一道关于需要处理整数溢出的运算的题时学到的概念,一般对于long long都承载不了的数我们一般用大整数都能解决,但是对于只是判断整数是否溢出时了解整数溢出的机制有时候能够事半功倍。


一、无符号整型溢出

对于unsigned整型溢出,C标准在这一方面是有定义的:“溢出后的数会以2^(8*sizeof(type))作模运算”,如果一个unsigned char溢出了,需要把溢出的值与256求模

二、有符号整型溢出

对于signed整型的溢出,C的规范定义是“undefined behavior”,虽然没有定义,各编译器可自己实现,大部分的溢出机制还是一样的。

有符号整型溢出可以分为向上溢出和向下溢出。假设用k个字节表示一个整型变量, 那么这个变量可以表示的有符号整数的范围是-2^(8k-1) ~ 2^(8k-1) – 1,两个正整数或者两个负整数相加就有可能超过这个整型变量所能表示的范围, 向上超出>2^(8k-1) – 1称之为向上溢出, 向下超出<-2^(8k-1) 我们称之为向下溢出

先说对于所有溢出情况的结论,当溢出时(以signed char举例),我们会取结果的低八位,并对其表示的符号位判断该数字的正负

对于两数之和是否溢出的判断,这时候我们就可以得出:两个正数相加后溢出结果将 <0,两个负数相加后溢出结果将>=0

相关文章
|
3月前
|
C语言
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
这篇文章展示了如何使用栈(包括顺序栈和链栈)实现将十进制数值转换成八进制数值的方法,通过C语言编程演示了两种栈的实现方式和使用场景。
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
|
6月前
求两个整数的较大值
两幅图片展示,无文字描述。第一张图链接源为:[结果](https://so.csdn.net/so/search?q=%E7%BB%93%E6%9E%9C&spm=1001.2101.3001.7020)。
35 1
求两个整数的较大值
溢出行为
在 Julia 中,超出类型最大值的计算会导致环绕行为,如 `typemax(Int64)` 加 1 结果变为 `typemin(Int64)`,显示了模算术特性。为了避免溢出错误,需检查边界或使用 BigInt 进行任意精度运算。例如,`10^19` 溢出,而 `big(10)^19` 则正确计算为 `10000000000000000000`。
|
6月前
|
存储 人工智能 程序员
溢出、截断、类型提升:从易错代码入手分析整型数据存储与类型转换
这篇文章介绍了关于数据在内存中的存储以及可能出现的溢出问题,包括整型数据的存储方式、取值范围以及溢出的现象和原因。文章通过例子和罗盘图解释了整型数据溢出时的计算过程,并指出在进行运算时要注意数据类型的转换和可能的溢出情况。此外,文章还给出了几个练习题,帮助读者理解和应用这些知识。
179 0
|
6月前
|
存储 算法
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
45 0
|
6月前
|
存储
面试题:计算机内部如何存储负数和浮点数?
面试题:计算机内部如何存储负数和浮点数?
107 0
|
存储 人工智能 C语言
整型在内存中的存储,整型最大值最小值的推导,以及大小端的介绍
整型在内存中的存储,整型最大值最小值的推导,以及大小端的介绍
|
C++
C++ 各种无符号整型能够在溢出之前计算出斐波那契数列的最大项数是几?答案是24、47、93
C++ 各种无符号整型能够在溢出之前计算出斐波那契数列的最大项数是几?答案是24、47、93
79 0
2.2.4加减运算和溢出判断
2.2.4加减运算和溢出判断
|
存储
用补码计算x+y,并判断结果是否溢出问题
浮点数的加减法与是否溢出的判断,是计算机组成原理中的数据存储的一个入门。至于溢出情况,如果01就是正溢出,00,11未溢出,10负溢出。
688 0
用补码计算x+y,并判断结果是否溢出问题