首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

long long是8个字节,但是我得到了整数溢出?

long long 是 C 和 C++ 语言中的一种数据类型,通常用于表示长整数。在大多数现代系统上,long long 类型通常是 64 位的,即占用 8 个字节。这意味着它可以表示的整数范围是从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。

整数溢出发生在当一个整数值超出了它所能表示的最大范围时。例如,如果你尝试将一个大于 9,223,372,036,854,775,807 的值赋给一个 long long 类型的变量,就会发生正数溢出;如果尝试将一个小于 -9,223,372,036,854,775,808 的值赋给它,就会发生负数溢出。

整数溢出的原因可能包括:

  1. 算术运算:两个大的正数相加可能会超出 long long 的最大值。
  2. 类型转换:将一个更大的整数类型(如 __int128)强制转换为 long long 时可能会溢出。
  3. 输入错误:用户输入了一个超出预期范围的数值。

解决整数溢出的方法包括:

  1. 检查范围:在进行可能导致溢出的操作之前,检查数值是否在安全范围内。
  2. 使用更大的数据类型:如果系统支持,可以使用 __int128 或其他更大的整数类型。
  3. 模运算:对于某些应用,可以通过模运算来避免溢出,例如在计算哈希值时。
  4. 使用库函数:一些编程语言提供了处理大数的库,如 C++ 的 boost::multiprecision 库。

以下是一个简单的 C++ 示例,演示如何检查整数溢出:

代码语言:txt
复制
#include <iostream>
#include <limits>

bool safeAdd(long long a, long long b) {
    if ((b > 0 && a > std::numeric_limits<long long>::max() - b) ||
        (b < 0 && a < std::numeric_limits<long long>::min() - b)) {
        return false; // 溢出
    }
    return true; // 安全
}

int main() {
    long long x = 9223372036854775807LL;
    long long y = 1;

    if (safeAdd(x, y)) {
        std::cout << x + y << std::endl;
    } else {
        std::cout << "Integer overflow occurred!" << std::endl;
    }

    return 0;
}

在这个例子中,safeAdd 函数在尝试相加之前检查是否会溢出。如果会溢出,它返回 false,否则返回 true 并执行加法。

参考链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 【C数据(一)】数据类型和变量你真的理解了吗?来看看这篇

    前言 一、数据类型 C语言主要的数据类型和变量的数据类型有: 基本数据类型: 整数类型: char:字符类型,占1字节 short:短整型,占2字节 int:整型,占4字节 long:长整型,占...⼀个类型,⽽使⽤整数0在 表示假,非零表示真。...在C99中也引⼊了布尔类型,专⻔表⽰真假的。 布尔类型的使⽤包含头⽂件 布尔类型变量的取值:true或者false....C语言主要数据类型的长度: char: 1字节 short: 2字节 int: 32/64位系统通常为4字节 long: 4字节 long long: 8字节 float: 4字节 double: 8字节...默认情况下所有整数类型(char、short、int、long)都是signed的。 unsigned: 无符号整数类型,只能表示非负整数,范围比signed类型更大。

    82210

    【C语言加油站】数据在内存中的存储

    从这次的测试结果我们可以得到以下结论: 有符号整数在内存中是以补码的形式进行存储 正整数的原码、反码与补码相等 负整数的原码按位取反得反码,反码+1补码 负整数的补码按位取反再+1原码 2.3 采用补码存储整数的原因...这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit 位,但是在C语言中除了8 bit 的char 之外,还有16 bit 的short 型,32 bit 的long...但是,不怕一万就怕万一,如果哪天我们真的遇到了此类问题,我们应该需要知道问题出在哪里,以及如何解决问题。 接下来我们要探讨的整型与浮点型数据之间运算的问题。...从变量c与变量d的输出来看,直接对这两种类型进行运算时没有任何问题的;但是当我们直接对结果进行输出时,则会出现算术溢出的问题,溢出的原因整型在运算时由4个字节转换到了8个字节,系统给出的解决方法在调用...float类型之后,还是会存在算术溢出的问题,但是将其转换成double类型之后,则不再存在算术溢出的问题。

    11710

    4. C语言 -- 一个由数据类型和取值范围引发的 BUG

    ✎然后就紧赶慢赶出了这篇稿子,但是由于一些原因,在今天才与大家间面。 之前就有小伙伴留言说建议在上次的内容后面加上数据类型,反码补码等知识。还很是激动的,居然猜出了今天要讲的内容。...C语言 -- 叫你一声你敢答应嘛》的 2.3 部分讲到 char 字符型,占用一个字节;而 int 整型,通常反映了所用机器中整数的最自然长度。那一个字节和机器中整数的最自然长度到底多大的呢?...如上图所示,有许多的 Warning,根据提示可知,这是由于sizeof返回的一个long unsigned int的变量,所以使用 %d作为占位符有可能溢出,修改方法将上面的%d改为%ld。...2.1 比特与字节 CPU能读懂的最小单位比特位,记为bit,b,只能取 0 1 两个数字;内存机构的最小寻址单位字节,记为Byte,B。如下图所示,为字节和比特之间的关系 ?...但是对于存放signed类型的数据,左边第一位表示符号位。符号位为0,表示正整数;为1,表示负整数。一个8位的整型变量,除去左边第一位符号位,剩下表示值的只有7个比特位。

    84920

    java文档注释符号_java的注释符号

    /* * * * 一 * 个 * 多行注释 */ /** * 一个文档注释/DOC注释 * 也可以注释多行内容 * 除此之外,还可以添加一些作者/时间/版本...的信息 *...300;//错,300int类型,byte存不下 //int z = 999999999999;//错,虽然int类型,但是超出范围 long h = 999999999999L;//如果要定义long...b = (byte)i; //打印的结果-128 因为 byte 类型 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。...5.3 整数运算溢出 整数运算,类似于一个钟表,转到最大时,再转会回到最小。 计算:光速运行一年的长度是多少米?...3亿m/s //溢出的现象: //因为做了大的整型数据的运算,会超出int取值范围。解决方法:把整数提升成long类型。

    10.3K21

    基础篇:JAVA基本类型

    1和0储存,理论上只需1bit即可储存 1byte: 计算机处理数据的最小单位1byte,用一字节的最低位存储,其他的用0填补。...,不会随着系统或者jvm配置的位数而改变 3:char类型变量能不能储存一个中文的汉字,为什么 java 默认编码unicode编码方式每个字符占用两个字节,char16位类型,因此可以储存中文字符...,但有符号整数比无符号整数计算麻烦,因此实际储存将指数转为无符号整数,表示8bit的二进制范围为0~255,真实指数需要减去偏移量127。...但是绝对能保证有效7位左右的十进制数;double尾数位52,2^52=4503599627370496,16位的数字,加上整数位2^53也是个16位数字,因此绝对能保证有效位精确是15位的十进制数...+= 1 -> s1 = (short) s1+ 1; 编译不会报错 8:不同的基本类型强制转换,可能会产生什么问题 浮点型转整型,精度丢失、数据溢出 取值范围大的整型转取值范围小的整型,数据溢出

    1.2K20

    Java基础-数据类型

    一、基本类型 1、数值型 1)整数类型:byte,short,int,long int i = 10; // 整数常量默认 int 类型 long l = 10L; // long 类型常量需在整数后添加...-1),(2^(n-1))-1,符合上面4个整数类型的范围表示 具体分析如下图: 注: 1)1byte=8bit,即 1个字节(1B)占 8位(b) 2)float和double范围的推算涉及计算机组成原理中浮点数的表示和运算...如32位(4字节)的 int类型可以自动转换为64位(8字节)的double类型 // 小 -> 大(低位 -> 高位) byte -> short -> char -> int -> long ->...2、接口(interface) 1)接口一个抽象类型,抽象方法的集合。 2)几点注意: 接口无法被实例化,但是可以被实现。...数组引用数据类型,可以赋值为 null,表示没有引用任何内存空间。 正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

    25133

    大小端对齐,正码,反码,补码 ~ 附整数溢出的探讨

    int,占4个字节(byte),而1byte=8个bit 所以看图: ? ? 再根据低低高高的原则,就是这样放了 ? 验证一下的想法:(1不够了,所以用0补) ?...---- 之前说到了long的争议(http://www.cnblogs.com/dotnetcrazy/p/8059210.html),这边就不用long来举例了,用int吧 可以看一下这篇文章(http...说一下QWORD,之前也被网上误导了,网上很多都是说无符号的word,按照惯例,如果unsigned word,那么所占字节应该和word一样才对 验证:有无符号,他所占字节并不变 ?...但是对二进制数来说,先减1后取反和先取反后加1得到的结果一样的,故仍可采用取反加1 的方法。 这些都比较简单,下面说下补码的好处: ? 体验分析一下 7-6=1;-7+6=-1 ?.../item/反码#5 ---- 3.整数溢出探讨 intmax=0x7FFFFFFF; (2147483647) 不清楚的可以看这个图,第一位符号位,后面数值部分,所以第一个最大7,其他最大F

    87531

    C语言数据的表示和存储(IEEE 754标准)

    机器数指补码,真值则是这个数原来的十进制形式。 变形补码:补码的符号位只有一位,容易溢出。所以便有了变形补码,它的符号为有两位,不会溢出。...unsigned short(2字节) 0——65535 unsigned long(4字节) 0——4294967296 带符号整数在机器中也是以二进制补码形式存放的...但是有个例外,2147483648他的补码这样的‭110000000000000000000000000000000 (33位数字),我们说最高位符号位,所以反码应该是‭101111111111111111111111111111111...long。...这样使得类型int类型。 浮点数的表示不同于整数(整数定点数)。表示起来很麻烦。float,double,long double。 ? 第0位符号位,0表示正数,1表示负数。

    1.6K30

    Java匹马行天下之教你用学汉语式方法学编程语言

    一个月前的《Java匹马行天下》其实已经更新到Spring框架了,但是没有继续更新下去,因为又有一届大一新生步入了软件这个大家庭,作为“学长”,为了弥补自己内心的一丝遗憾,毅然停下来前进的脚步,...或许写的不都是对的,但我保证每一篇都是用自己的理解认真去写的,真的站到了作为小白的立场去写的,也不知道这样做的意义何在,或许是感恩,也或许是善良,也或许是自作多情,不管是什么吧,都不重要,重要的已经做了...同理,整数型容器中装的整数整数都有大小,byte、short、int、long就相当于容器的容量,byte最小,依次增大,这样你就要注意了,以后在往整数型这个容器中“装整数”的时候,要看所选整数的大小...,例如可以将byte类型的整数赋值给short类型的整数,可以将short类型的整数赋值给int类型的整数,可以将int类型的整数赋值给long类型的整数。...哈哈,开玩笑的,别忘了计算机死的,不会思考,就拿那个方程式来说吧,你给变量X赋一个数值,你告诉它这个数值是什么数据类型,计算机才能知道,才能进行相应的计算。

    51920

    Linux时间子系统之时间的表示示例详解

    但是,如果在64位处理器上也有8个字节长(64位),这时候jiffies和jiffies_64两个全局变量完全等价的。...但是翻遍所有代码你也找不到全局变量jiffies的定义,最终在内核的链接脚本中(对于Arm64架构来说脚本位于arch/arm64/kernel/vmlinux.lds.S中)找到了下面这行: jiffies...也就是说,在32位机器上,jiffies和jiffies_64的低4个字节一样的。...我们可以举个例子,为了简单起见,以8位无符号整数为例,其取值范围0到255(0xFF)。假设当前时间250,那么过5个Tick之后,就是255了,已经到达了能表达的最大值。...但是,如果我们先将这两个数相减,也就是0-250(0-0xFA),也会产生溢出,最终得到的数刚好6。但这也是有限制的,两个比较的时间之间的差值不能超过最大表示范围的一半。

    3.8K21

    数值信息的机器级存储

    但是我们代码中定义的各种数值又是如何转换为二进制串存储在这些「字节」里面的呢?为什么两个整数相加之后的结果会变成负数? 等等这些类似问题,其实都归咎于 计算机中如何存储各种类型的数值的。...例如: //这里统一使用八位一个字节来表述一个整数 5 :==0==000 0101 -10:==1==000 1010 最高有效位表述的这个整数的符号,1 表示负数,0 表示正数。...例如:Java 中 int 类型的变量占 32 bits,long 类型的变量占 64 bits,那么一个 int 类型的变量 x,如果被赋值给了一个 long 类型的变量 y,那么 y 的高 32...于是人们想到了让阶码加上一个很大的正数以保证加完后的结果正数,这样阶码之间的大小比较就完全变成了两个正数之间的数值比较。...就目前而言,也不能保证,懂得了计算机如何存储数值的就一定能够提高你的编程能力,但是等到你程序中出现数值运算错误而无法解决的时候,这一点点基础知识一定能帮上忙。

    1.3K60

    java中的常量与变量

    整数型    byte short int long     浮点型    float double     字符型    char     布尔型    boolean  简要提一下引用数据类型:字符串...取值范围与内存占用不相关,就比如说图中的long占用8个字节而单精度浮点数float只占用四个字节但是float的取值范围却比long的取值范围大很多,这是因为float采用的科学计数法计算省空间。...3.数据范围与字节数不一定相关。例如:float数据范围比long更加广泛,但是float4字节long8字节。 4.浮点数当中默认类型double。...如果整数,默认为int类型,如果一定要使用long类型,需要加上一个后缀L。大小写后缀都可以,推荐使用大写字母后缀。...4.boolean类型不能发生数据类型转换  数据溢出:数据范围大的数据类型转换为数据范围小的数据类型,装不下,数据溢出了。 精度损失:就是把有一部分数据的精度给舍掉了。

    1K20

    c语言设计计算器-【C语言-5】吃透C语言整型,快速计算取值范围!

    整型数据类型   在上一节当中,我们遇到了用int(整数的缩写)来表示一个整数的数据类型。   这一节中,我们来详细讨论一下C语言里面的整数数据类型。   ...那么接下来,你可能想知道这些类型中,它们分别占用几个字节,具体的数据范围是多少?从而合适地选择数据类型。很遗憾,不能准确地告诉大家。...=%d\n", sizeof(long));   运行一下,我们看到了结果。   ...值得注意的在Visual Studio 2019中,int和long均占用4个字节。这并未违反C语言标准,C语言标准规定高级别的类型取值范围不得小于低级别的类型,但是它们可以是一致的。   ...结果为1000,但是由于仅有3位二进制来保存数据,最高位1被丢弃了。结果为000,居然得到了正确的结果0。为什么会这样呢?

    2.6K30

    redis内部数据结构详解

    需要获取时需要遍历字符串,操作复杂度为O(n); SDS直接通过len属性获取长度,复杂度仅为O(1); 杜绝缓冲区溢出: c字符串执行字符串拼接操作时需要预先分配内存,若未分配内存造成容易造成缓冲区溢出...SDS的len属性,避免了缓冲区的溢出问题;free属性避免了内存泄漏的问题; 减少修改字符串时带来的内存重分配次数: C字符串执行拼接或截断操作时为了避免缓冲区溢出和内存泄漏问题, 需要进行内存重分配...length; //表中层数最大的节点的层数 int level; } zskiplist; 整数集合 整数集合集合键的底层实现之一,当集合中只包含整数,且数量不多时,会使用整数集合来实现...,当列表中只包含少量列表项且每个项小的整数或者小的字符串时,reids会用压缩列表来实现列表键和哈希键; 每个压缩列表的节点可以保存一个字节数组或一个整数字节数组有为三种长度; 压缩列表存在连锁更新的问题...,由于内部连续的内存块组成的顺序型存储结构,当某个节点需要扩展字节长度时,后续节点的previous_entry_length需要扩展大小,因此会引发连续更新;但是因为节点数量不多,因此性能影响可以忽略

    67820

    万字长文的Redis五种数据结构详解(理论+实战),建议收藏。

    String类型 StringRedis最基本的数据类型,上面的简介中也说到Redis用c语言开发的。但是Redis中的字符串和c语言中的字符串类型却是有明显的区别。...SDS 假如存储的「字符串一个字符串值并且长度大于32个字节」就会使用SDS(simple dynamic string)方式进行存储,并且encoding设置为raw;若是「字符串长度小于等于32个字节...(2)「c语言」中两个字符串拼接,若是没有分配足够长度的内存空间就「会出现缓冲区溢出的情况」;而「SDS」会先根据len属性判断空间是否满足要求,若是空间不够,就会进行相应的空间扩展,所以「不会出现缓冲区溢出的情况...还可以保存二进制数据 n次增长字符串必然会带来n次的内存分配 n次增长字符串内存分配的次数<=n String类型应用 说到这里相信很多人可以说已经精通Redis的String类型了,但是纯理论的精通...Set集合 Redis中列表和集合都可以用来存储字符串,但是「Set不可重复的集合,而List列表可以存储相同的字符串」,Set集合无序的这个和后面讲的ZSet有序集合相对。

    6.1K20

    Java基础 - 入门

    字节(byte):计算机中 数据处理 的基本单位,习惯上用大写 B 来表示, 1B(byte,字节)= 8bit(位) 字符:指计算机中使用的字母、数字、字和符号 ASCIIS...,例如: int i =128; byte b = (byte)i; 因为 byte 类型 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出 浮点数到整数的转换通过舍弃小数得到...,但可能造成精度降低或溢出 强制类型转换的语法格式: (type)var ,运算符"()"中的type表示将值var想要转换成的目标数据类型 条件转换的数据类型必须兼容的 public static...years = 20; int total = money * years; //返回的负数,-1474836480 内存溢出 long tota2 = money...1474836480 默认int 因此结果会转成int值 再转成long 但是已经发生了数据丢失 long tota3 = (long)money * years; //先将一个因子变成

    88210

    从未见过的牛逼解说方式!Redis五种数据结构,看一遍就懂了

    image String类型 StringRedis最基本的数据类型,上面的简介中也说到Redis用c语言开发的。但是Redis中的字符串和c语言中的字符串类型却是有明显的区别。...(2)「c语言」中两个字符串拼接,若是没有分配足够长度的内存空间就「会出现缓冲区溢出的情况」;而「SDS」会先根据len属性判断空间是否满足要求,若是空间不够,就会进行相应的空间扩展,所以「不会出现缓冲区溢出的情况...还可以保存二进制数据 n次增长字符串必然会带来n次的内存分配 n次增长字符串内存分配的次数<=n String类型应用 说到这里相信很多人可以说已经精通Redis的String类型了,但是纯理论的精通...扩展操作:ht[1]扩展的大小比当前 ht[0].used 值的二倍大的第一个 2 的整数幂;收缩操作:ht[0].used 的第一个大于等于的 2 的整数幂。...Set集合 Redis中列表和集合都可以用来存储字符串,但是「Set不可重复的集合,而List列表可以存储相同的字符串」,Set集合无序的这个和后面讲的ZSet有序集合相对。

    68110

    Python 的整数与 Numpy 的数据溢出

    某位 A 同学发了一张截图,问为何结果中出现了负数? ? 看了图,第一感觉就是数据溢出了。数据超出能表示的最大值,就会出现奇奇怪怪的结果。...所以新的问题:如果说上图的数据溢出了,为何直接相乘的数却没有溢出? 由于我一直忽视数据的表示规则(整型的上限是多少?)...最后,经过学习群里的一番讨论,才终于明白怎么回事,所以本文把相关知识点做个梳理。 在开始之前,先总结一下上图会引出的话题: Python 3 中整数的上限是多少?Python 2 呢?...其大小有限,可通过sys.maxint() 查看(取决于平台 32 位还是 64 位) 一种整数,即大小无限的整数,用 long 表示,有个内置函数 long()。...但是到了 Python 3,情况就不同了:它仅有一种内置的整数,表示为 int,形式上 Python 2 的短整数,但实际上它能表示的范围无限,行为上更像是长整数

    2.1K41
    领券