
知识点提炼
CPU的字长32位or64位,一次读写的内存就是一个int
字长取决于数据总线宽度,代表一次可以取多少的数据。地址总线,相当于取数据的地址范围,可以这样比方,地址总线——旅馆里的房号;数据总线——一间房的大小。
bit指的是比特,就是“位”,8bit=1byte是字节
cpu的字长是32位,就是它一次能读取32个0或者1,由于8 bit 等于 1byte (注意单位,bit指的是比特,就是“位”,byte是字节)所以32个0或1 就是4字节
int数据类型表示4个字节
C语言的类型

各种类型不同之处的表现

运算符sizeof
sizeof:属于(静态)运算符,可以给出某个类型或者变量在内存里占据的字节数。//sizeof(int) sizeof(i)
//4个字节 一个字节8个bit,因此是一个32位bit的变量
int类型字节长度为4,double类型字节长度为8,longdouble类型字节长度为16;

注意:其结果在编译的时候就已经确定,与程序执行阶段无关,所以不能用来计算。但是可以放表达式。
因为C自动转换了这个表达式,其类型为double,所以字节长度是8,并非真正的计算
int a;
sizeof(a+1.0)
结果为->8,
整数类型
五种整数类型:char short int long longlong
整数类型的大小

结果:字节//-32的意思是当作32位的机器来做处理

int字节长度实际上是寄存器存放的字长(寄存器一次可以处理的数据大小),比如32位是32bit=4字节,64bit目前更长见

整数的内部 二进制/补码
怎么表达负数?——补码

补码的意义就是拿补码和原码相加会得到一个溢出的0.【零溢出事件】

整数的范围
char:1 字节,short:2 字节,int: 4字节,long: 8字节,longlong: 8字节

int的范围:-2^(32-1)~2^(32-1)-1 //4字节,一个字节8bit,4*8=32
对于一个字节(8位)可以表示的数为:00000000~11111111
//其中00000000表示十进制0,11111111~10000000表示(-1)~(-128),00000001~01111111表示1~127

只有char类型下的11111111表示-1,因为只有一个字节,char类型数据范围为-128~127.
unsigned:纯2进制
如果想要单纯的表示0~255,不要补码。需要在数据类型前面加上unsigned。
unsigned char a=255;
输出a会得到255.如果只是char a=255,则输出a会得到-1.
副作用,能表达的数的范围变化了,从-128-127变成了0-255。
补充:如果是一个字面量变量想要表示自己是unsigned可以在后面加上u或U,表示自己是long可以加l或L。但unsigned的意义不止是扩大表达范围,而是为了做纯二进制数的计算,主要是为了移位
整数的越界
在一个字节(char int)的计算中,-1+1=0,127+1=-128.0-1=-1,-128-1=127
char c=127;
c+=1;
printf("c=%d",c);//c=-128 越界了
unsigned char c=127;
c+=1;
printf("c=%d",c);//c=128 unsigned不考虑补码,纯二进制的计算
unsigned char c=255;
c+=1;
printf("c=%d",c);//c=0 256 8个bit 1 0000 0000 =====1被丢掉

在一个字节8位(8个bit/ 一个字节)

int数据类型的最大数
2的31次方2147483648
2^31-1,是32位操作系统中最大的符号型整型常量
int a=0;
while(++a>0)
;
printf("int数据类型的最大数是:%d\n",a-1);//int数据类型的最大数是:2147483647
整数的输入输出(格式化)
printf/scanf:整数的输入输出实际上只有两种:int类型和long long类型
所有小于int,char short int ——%d
所有比int大的,long longlong——%ld
unsigned(纯二进制)是例外且这两种都可以加,因为这两种实际上没有区别,只是我们看待他们的方式不同,
char c=-1;
int i=-1;
printf("c=%u,i=%u\n",c,i);
return 0;

这一串数字即为unsigned int可以表示的位数,按理来说c的结果不应该是这个,但是printf这个函数在传递小于int的变量类型时会将其转换为int,所以二者结果相等。
如何选择整数类型:int
为什么有那么多的整数类型!原因是早期的语言需要准确表示计算机内部的结构、接口等。 那今天我们学习时候如何选择整数的类型呢?
没什么特殊需要,就用int

8进制和16进制
以0开头的数字字面量为八进制,以0x开头的数字字面量为十六进制。//输出%d的意思就是想看到10进制的结果
char c=012;
int i=0x12;
printf("c=%d,i=%d\n",c,i);//c=10;i=18
(这个程序的内核其实是,你将一串数字定义为八进制或者十六进制,然后让计算机转换成十进制并输出。当你将格式化输出符更改之后,这些数字的意义也就随之改变了。比如)
八进制和十六进制很适合表示二进制数据。因为四位二进制为一个十六进制位。三位二进制为一个八进制位。
printf和scanf的进制形式
c=%d//想要输出形式十进制
c=%o//想要输出形式八进制
i=%x;//想要输出形式16进制 —— %x输出小写,%X输出大写字母。16进制中有字母,小写x输出小写字母,大写X输出大写字母。