将一个超出范围的值赋给整形会发生什么?
一、假设该超出范围的值是a(a>0),则将a用2进制表示,之后将a对数据类型的模数取模(int为32位,模数为232。小数模数为2),设运算结果为b(b是一个二进制数)。
最后将2进制的b转换为10进制即可。
二、可理解为下图的循环:
例:
- 输入231+1,则数字显示为-(231-1),即-2147483647。
- 输入-5,则数字显示为-5
含义:
- 可理解为该数从0开始,向“加”方向走了231+1步。也可理解为该数从231-1开始,向“加”方向走了2步,第一步走到-231,第二步走到-(231-1)。
- 该数从0开始,向“减”方向走了5步,最后位于“-5”位置。
试验
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 |
标签:超出范围,int,long,2147483647,printf,sizeof,整形,231 From: https://www.cnblogs.com/FishSmallWorld/p/17073407.html