【快速学】整型数据溢出(以int为例)
1、将一个超出范围的值赋给整形会发生什么?
1.1 计算法
假设该超出范围的值是a
用更大的数据类型表示a(补码),之后保留低位(int类型,保留32位),记为b。
最后将2进制的b(补码)转换为10进制数即可。
例1:
设a=2^32
a的补码 1 0000 0000 0000 0000 0000 0000 0000 0000
保留低的32位,记为b 0000 0000 0000 0000 0000 0000 0000 0000
将b看作int类型的数据,转化为10进制,结果为0
例2:
设a=-2^31-1
a的原码(用一个更大的数据类型表示) 100 1000 0000 0000 0000 0000 0000 0000 0001(红色的1是符号位,我用了一个35位的“数据类型”表示a)
a的反码111 0111 1111 1111 1111 1111 1111 1111 1110
a的补码111 0111 1111 1111 1111 1111 1111 1111 1111
保留低32位 0111 1111 1111 1111 1111 1111 1111 1111
转化为10进制 2^31-1
1.2 画圈法
可理解为下图的循环:
例:
- 输入231+1,则数字显示为-(231-1),即-2147483647。
- 输入-5,则数字显示为-5
含义:
- 可理解为该数从0开始,向“加”方向走了231+1步。也可理解为该数从231-1开始,向“加”方向走了2步,第一步走到-231,第二步走到-(231-1)。
- 该数从0开始,向“减”方向走了5步,最后位于“-5”位置。
2、试验
int为32位整型,数据范围为
-231 ~ 231-1即-2147483648~2147483647
试验程序:
/*
试验int是如何溢出的
*/
#include <stdio.h>
int main()
{
printf("先看看各整型的字节数\n");
printf("sizeof(char)=%lld\n", sizeof(char));
printf("sizeof(short)=%lld\n", sizeof(short));
printf("sizeof(int)=%lld\n", sizeof(int));
printf("sizeof(long)=%lld\n", sizeof(long));
printf("sizeof(long long)=%lld\n", sizeof(long long));
printf("得知int类型为4个字节,取值范围为-2147483648~2147483647\n\n");
int a[10]={};
a[0] = -2147483649;
a[1] = 2147483647+1;
a[2] = 2147483647+1+2147483647;
a[3] = 2147483647+1+2147483647+1;
a[4] = 2147483647+1+2147483647+1+2;
for(int i=0;i<5;i++)
{//输出结果
printf("(dec)a[%d]=%d\n",i, a[i]);
printf("(hex)a[%d]=%x\n",i, a[i]);
}
return 0;
}
运行结果:
先看看各整型的字节数 (dec)a[0]=2147483647 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效