一.数据类型归类
1.整型
char(1byte)---取决于编译器,通常默认为signed charunsigned charsigned charshort(2byte)---默认为signed short [int]unsigned short [int]signed short [int]int (4byte)---默认为signed intunsigned intsigned intlong(4byte)---默认为signed long [int]unsigned long [int]signed long [int]
2.浮点型
float(4byte)double(8byte)
3.构造类型
> 数组类型> 结构体类型 struct> 枚举类型 enum> 联合类型 union
4.指针类型
int *pi;
char *pc;
float* pf;
double *pd
void* pv;
5.空类型
void 表示空类型(无类型)通常应用于函数的返回类型、函数的参数、指针类
二.整型在内存中的存储
我们知道变量的创建需要在内存中开辟空间的,而开辟空间的大小是由数据类型决定的例如
int a=10;我们定义了一个整型变量a并把100赋给了a那么内存就会开辟4个字节的空间把100放在里面。那么10是怎么放在里面呢?想知道这些需要了解以下概念。
1.源码,反码,补码
大家知道计算机只能识别二进制数字,二进制数字有三种表示形式,分别为源码,反码和补码。
这三种形式都是由符号位与数值位组成。符号位上0代表该数为正数,1代表该数为负数。正数的三种形式都是一样的。负数的三种形式却是不同的。具体情况如下
源码:直接将二进制按照正负数的形式翻译成二进制就可以。
反码:源码符号位不变,数值位按位取反得到反码。
补码:反码加一即为补码。
对于整型来说,数据是以补码的形式存放在内存中的。为什么会这样呢?
在计算机系统中,数值一律用补码来表示和存储。原因在于使用补码,可以将符号位和数值域统一处理;(可以试一下分别用源码和补码算一下(-1)+2,看一下那个正确)同时,加法和减法也可以统一处理( CPU 只有加法器 )此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
2.大小端字节序
什么是大小端呢?
大端存储模式:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址处的存储 模式。
小端存储模式:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址处的存储 模式。
这样我们就明白了我们的机器是小端模式所以在内存中显示 0a 00 00 00.
3.练习
学了上面的知识给大家分享几个题目。
1.
//输出什么?
#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;
}
2.
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
3.
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}
4.
int i= -20;
unsigned int j = 10;
printf("%d\n",i+j);
5.
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
6.
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
7.
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}
这七个题目大家可以下去试试练练手我先给大家讲一下第一题
首先把-1的补码11111111 11111111 11111111 11111111 分别放到a b c中
由于三个都是char型(只占一个字节)所以会发生截断(数据的低位字节存到变量地址中)
a中只能存 11111111 b中会放11111111 c中也会放11111111
现在以有符号整型打印,a,b,c要发生整型提升,由于a,b为有符号型所以要在11111111前补符号位1补完之后是11111111 11111111 11111111 11111111所以打印的是-1,而c是无符号型整型提升时在前面补0,补完之后是00000000 00000000 00000000 11111111打印出来是255.
剩下的题目大家可以自己想一想如果不会可以私信问我啊。
三.浮点型在内存中的存储
我们常见的浮点数有3.1415926,1.414,2.732等它们是怎么在内存中存储呢?和整型一样么?
我们先看一下下面这个代码:
#include<stdio.h>
int main()
{
int n = 9;
float *pFloat = (float *)&n;
printf("n的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
*pFloat = 9.0;
printf("num的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
return 0;
}
它的结果是:
n与*pFloat存放的数据明明是相同的为什么打印出来的数差距却这么大。
我们要详细了解一下浮点型在内存中的存储。