#include<stdio.h>
int main() {
int num1=32767,num2;
num2=num1+1;
printf("%d,%d\n",num1,num2);
return 0;
}
输出 32767,-32768
分析 有符号基本整型变量int的范围是-32 768~32 767即 -2^15~(2^15-1),在上例中num1=32 767,由于计算机只识别二进制数,因而将num1转换成二进制数。当num1+1后,其结果超出了有符号基本整型变量的范围,此情况称为数据溢出,当达到最大值后,就又从最小值开始计数,因而当32 767加1后得不到32 768,而得到有符号基本整型变量取值的最小值-32 768,如图2.3.1所示。
num1:32 767
原码 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
补码 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
加1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
原码 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
变成了 - 0
就是-32768
当达到最大值后,就又从最小值开始计数
num2:-32 768
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
这个刚好体现了原码,补码的相关知识,估计以上程序是在16位机上运行的。
#include <iostream>
using namespace std;
int main()
{
short int i = 32767,j,k;
j = i + 1;
k = i + 2;
cout<<"j="<<j<<" k="<<k<<endl;
return 0;
}
如果加上2 的话就是输出-32767了 这个是通过补码运算严格运算出来的