文章目录
一、数据类型
1.1、整形家族
char
unsigned char
signed char
short
unsigned short
signed short
int
unsigned int
signed int
long
unsigned long
signed long
注:这里的unsigned int(无符号整形) 和signed int(有符号整形)唯一区别便是二进制位最高位代表什么意思。如、unsigned int便代表二进制位为数值位,有一定的数值大小。signed int最高二进制位为符号位。1代表负数,零代表整数。
1.2、浮点数家族
float
double
1.3、构造类型
数组类型
结构体类型struct
枚举类型enum
联合类型union
1.4、指针类型
char* pc
short* ps
int* pi
float* pf
void*
1.5、空类型
void 表示空类型
常用来表示函数的返回类型,函数的参数,指针类型
二、整形在内存中如何存储
2.1、原码,反码,补码
整数在内存中有三种表现形式,原码,反码,补码。
正数的原码,反码,补码相等
负数的原码,反码,补码转换如下图所示
除了这些,我们还要知道,我们在敲代码的时候,什么时候用的原码,什么时候用的补码。**至于反码,不过是原码到补码转换过程中的一个中间状态,具体没有太大含义。**下面我们用vs2019在编译器中寻找答案。注意,由于为了增加数据在内存中的可读性,数据的二进制位在内存中是用十六进制存放的。遗忘的同志,可以适当的复习一下
在这里我们不能的出什么结论,毕竟正数的原码,反码,补码相同。那我们继续往下看
如果看b=-5这个例子,结果就显而易见了。即,数据在内存中存放的是二进制补码。下面我们看一下打印结果。
结论:
这下我们就全部全部搞懂了,数据在内存中存放的是补码,而打印的是原码。
2.2、整形家族在内存中表示的范围,这里我们以char为例,其他情况类似
char类型分为signed char和unsigned char。
无符号的char由于最高的二进制位表示位数值位。故,数据的范围为00000000到11111111转化为十进制为0到255
有符号的char我们用画图来解释。
结论:
有符号的char在内存大小的范围是-128~127。
short int类型范围类似,可以自行推导
三、大小端字节序
3.1、大小端的概念
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地中。
四、习题练习
4.1、大小端判断
#include <stdio.h>
int check_size()
{
int a = 1;
//a的补码00000000000000000000000000000001
//00000001大端 或者01000000小端
//因此我们只需要查看数据在内存中存放的第一个字节的大小,
//值为1小端,为0大端
char* p = (char*)&a;
if (*p == 1)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
if (1 == check_size())
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
4.2、整形在内存中的存储中习题
//那么下段代码输出的结果是什么呢?
//%u 打印无符号整形
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
-128的原码
10000000000000000000000010000000
11111111111111111111111101111111 反码
11111111111111111111111110000000 补码
10000000 截断
11111111111111111111111110000000 整形提升 补码
因为%u以无符号数打印,故原码,反码,补码相等,为
11111111111111111111111110000000是一个很大的正整数。
当然,你也可以在计算器里算一下。
当然,后面也有几道类似习题,大家感兴趣也可以做一下,答案的话自己可以在编译器里跑一下就全部解决了。
例一:
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
例二:
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}
例三:
int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);