<1>数的范围
(1)整体范围:对于一个字节(8 bit)可以表达的数的范围为00000000——11111111;
(2)在数的范围中
- 00000000——>0;
- 00000001~ 01111111——>1~ 127,高位为0,在纯二进制中表示1~127;
- 10000000~ 11111111——>-1~ -128,高位为1,在补码表示-1~ -128;
计算机中所存在的一切数据都用纯二进制表示,但是我们在使用过程中通常当它为整数(一个字节char的整数)以11111111为例,纯二进制表示为255,但是以整数看则为-1
1)代码运行如下:
#include<stdio.h>
int main(){
int i=255;
char c=255;
printf("%d %d",i,c);
return 0;
}
输出结果:c=-1,i=255;
出现此类情况的原因是:c为字符型,仅有一个字节8bit,但是i为整型,有32bit;
//11111111;
//00000000 00000000 00000000 11111111;
由此得出整数的范围:
char:1字节:-128~127;
short:2字节:-32768~32767;
int:取决于编译器(CPU),通常为一个字节:-2^(32-1) ~ 2^(32-1)-1;
long:4个字节;
long long:8个字节;
注意:之所以负数部分比整数部分大一,是因为将256分成三份,负数部分(128);0;正数部分(127);
总结规律:整数类型的范围为-2^(n-1)~ 2^(n-1)-1;
若我们希望数据以二进制类型得出,则需要在类型前使用unsigned
<2>引入unsigned
————unsigned意为整数不以补码的形式输出,也可以理解为最高位为1的数全部以纯二进制类型看待
(1)代码如下:将char c=255改为unsigned char c=255,输出则为c=255;
unsigned在char中应用:
不使用unsigned:00000000-11111111在char中的范围为-128~127;
使用unsigned:00000000-11111111在char中正数范围扩大,上限由127扩大到258,但是不能表达负数;
1. 若一个字面量想常数想表达自己为unsigned,可以在后面加上u或者U(例如255U);
2. 用l或者L表示long(long);
3. unsigned引入的初衷并不是是为了扩大数能表达的范围,而是为了做纯二进制运算,主要是为了移位;
<3>整数越界
整数是以纯二进制方式进行计算的,所以:
- 11111111(-1)+1->100000000->0;
- 01111111(127)+1->10000000->-128;
- 10000000(128)-1->01111111->127;
由此可以总结出规律,将整数范围看作一个圆圈,圆圈以-1/0;127/-128为分界线,
正确顺序:
-128||127
-1||0
1. 在-1||0之间顺时针走:0-1=-1;逆时针走-1+1=0;
2. 在-128||127之间顺时针走:127+1=-128;逆时针走-128-1=127
2)对于unsigned而言这个圆圈分界为255||0;255+1=0,0-1=255;
一段可以得出int数据类型最大数和位数的代码
#include<stdio.h>
int mian(){
int a=0,b=0;
while (++a>0);注释:达到最大值后加一结果会变为负数
printf("int数据类型最大数是:%d\n",a-1);
b++;
while ((a=a/10)!=0){
b++;
}
printf("int数据类型最大的数的数位是:%d,b);
return 0;
}