【快速学】整型数据溢出(以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 画圈法

可理解为下图的循环:

例:

  1. 输入231+1,则数字显示为-(231-1),即-2147483647。
  2. 输入-5,则数字显示为-5

含义:

  1. 可理解为该数从0开始,向“加”方向走了231+1步。也可理解为该数从231-1开始,向“加”方向走了2步,第一步走到-231,第二步走到-(231-1)。
  2. 该数从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;
}

运行结果:

先看看各整型的字节数
sizeof(char)=1
sizeof(short)=2
sizeof(int)=4
sizeof(long)=4
sizeof(long long)=8
得知int类型为4个字节,取值范围为-2147483648~2147483647

(dec)a[0]=2147483647
(hex)a[0]=7fffffff
(dec)a[1]=-2147483648
(hex)a[1]=80000000
(dec)a[2]=-1
(hex)a[2]=ffffffff
(dec)a[3]=0
(hex)a[3]=0
(dec)a[4]=2
(hex)a[4]=2

 

posted @ 2023-01-29 18:09  尚方咸鱼  阅读(379)  评论(0编辑  收藏  举报