数据类型介绍
char //字符型数据
short //短整型
int //整型
long //长整型
long long //更长的整型
float //单精度浮点数
double //双精度浮点数
类型的定义:
1.使用这个类型开辟内存空间的大小(决定了使用范围)
2.如何看待内存空间的视角
类型的基本分类
整型
char //由于内存中存储ASCII码值,,所以归为整型
unsigned char
signed char
short
unsigned short
signed short
int
unsigned int
signed int
long
unsigned long
signed long
浮点数
float
double
构造类型
即自定义类型
数组类型
结构体类型struct
枚举类型enum
联合类型union
指针类型
int* pi;
char* pc;
float* pf;
void* pv;
空类型
void表示空类型
通常用于函数的返回类型、函数的参数、指针类型
整型在内存中的存储
原码、反码、补码
整数的二进制表示有三种形式:原码、反码、补码
正整数:原码、反码、补码相同
负整数:原码、反码、补码需要计算
a=-10
原码10000000 00000000 00000000 00001010
反码11111111 11111111 11111111 11110101
//原码符号位不变,其它位按位取反码
补码11111111 11111111 11111111 11110110
//反码+1得到补码
调试-内存窗口-&a-内存中放的是十六进制f6 ff ff ff
说明:整数在内存中存储的是补码
原因:使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理( CPU只有加法器);此外,原码与补码相互转换,其运算过程是相同的,不需要额外的硬件电路。
如果用原码:1-1=1+(-1)
//00000000 00000000 00000000 00000001
//10000000 00000000 00000000 00000001
//10000000 00000000 00000000 00000010得到结果是-2
字节序
大端字节序:把数据的低位字节内容放在高地址处,高位字节的内容放在低地址处
小端字节序:把数据的低位字节内容放在低地址处,高位字节的内容放在高地址处
为什么会有大小端模式之分?
因为在计算机系统中,是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。
例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0×22为低字节。对于大端模式,就将Ox11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的×86结构是小端模式,而KEILC51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
代码判断当前机器字节序
//判断是大端序还是小端序
int main() {
int a = 1; //小端:01 00 00 00;大端:00 00 00 01
//取第一个字节看是什么
char* p = (char*)&a; //int*
if (*p == 1) {
printf("小端\n");
}
else {
printf("大端\n");
}
return 0;
}
int main() {
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i <= 12; i++) {
arr[i] = 0;
printf("a");
}
return 0;
}
运行后出现死循环,打开监视窗口发现arr[10]、arr[11]、arr[12]的值都被改成0,而&i==&arr[12],所以此时i又被赋值为0,产生死循环。
i和arr是局部变量,放在栈区上,而栈区内存的使用习惯是:先使用高地址空间,再使用低地址空间
数组随着下标增长,地址是由低到高变化的
由于先定义i,所以i为更高地址,在arr溢出后,很有可能访问到i,release不会死循环,因为release会优化;如果后定义i,那么会报错:非法访问内存。