1.数据类型详细介绍
2.整形在内存中的储存:源码,反码,补码
3.大小端字节序介绍及判断
4.浮点型在内存中的储存解析
1.数据类型介绍(内置类型)
char (1个字节)
short(2个字节)
int (4个字节)
long
long long
float
double (8个字节)
类型的意义
使用这个类型开辟内存空间的大小(大小决定了使用范围)
类型决定了如何看待内存空间的视角
整形家族(整形存在内存中的形式是以补码的形式存储的)
char()
unsigned char(无符号char)
signed char(有符号char)
如果我们把01010001的最高位0当成一个符号位来看待那他就是一个有符号数,那他就是个有符号的 char,最高位为正数,,那如果把它当成一个 无符号数, 那他就没有符号位,只有正数没有负数,而最高位0不用来表达符号位了而是有效位,能表达的数会更大一些,范围更大一下
如果一个数是有符号数的话那他能表示的范围就是:-128到127
如果一个数是无符号数的话那他就能表达的范围是:0到255
对于任何有符号和无符号都是这样
int
unsigned int
signed int
short
unsigned short
signed short
long
unsigned long
signed long
浮点型家族
floar--单精度
double--双精度
构造类型:(自己创造的一种类型)
数组类型(自定义类型)
结构体类型struct(自定义类型)
枚举类型enum(自定义类型)
联合类型union(自定义类型)
指针类型:
int *pi;
char *pc;
float *pf;
void *pv;
空类型:
void表示空类型(无类型)
通常用于函数的返回类型,函数的参数,指针类型
2.整形在内存中的存储
我们之前讲过一个变量的创建是要在内存中开辟空间的,空间的大小是根据不同的类型决定的
那接下来我们聊一聊数据所在开辟内存中到底是如何存储的
比如
int a = 20;
int b = -10;
我们知道为a分配四个字节的空间,那如何存储
首先我们要了解源码,反码补码
计算机中的有符号数(整形有符号数值)有三种表达方法,即源码,反码,补码
三种表示方式均有符号位和数值位两部分,符号位都是用0表示’正‘,用1表示‘负’,而数值位的三种表达方式不同
源码
直接将二进制按照正负数的形式翻译成二进制就可以
反码
将源码的符号位不变,其他值按位取反就可以得到
补码
反码的基础上加1
无符号数也有源码,反码,补码,但是它们都相同
有符号数的源码,反码,补码各不相同
正数的源码,反码,补码都相同,负数则各不相同
对于整形来说,数据存放内存中其实存放的是二进制补码
内存中显示的是十六进制,所以要先换算
整数
1.有符号数:正数:源,反,补码相同
负数:源,反,补码不同,要进行计算
2.无符号数:没有负数,正数源码,反码,补码都相同
大小端字节序介绍及判断
什么是大小端:
大端(大端字节序)存储模式:是指数据的低位保存在内存中的高地址中,而数据的高位,保存在数据的低地址中(正着存)
小端(小端字节序)存储模式:是指数据的低位保存在内存中的低地址中,而数据的高位,保存在内存的高地址中(倒着存)
写一段代码判断当前字节序的大小端
#define _
#include<stdio.h>
int main()
{
int a = 1;
char* p = (char*)&a;//char*向后访问一个字节
if(*p == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
有符号的char的范围是:-128到127的范围
无符号的char的范围是:0到255的范围
127+1 = 128
如果以%d的方式打印的话,打印的就是源码,储存在内存中的二进制是补码
浮点型在内存 中的存储解析
任意一个二进制浮点数v可以表示成下面的形式
(-1)^S*M*2^E
-1^S表示符号位,当s = 0,v为正数,当s = 1时,v为负数
M表示有效数字,大于等于1,小于2
2^E表示指数位(从左往右,小数点后几位就有多少位,指数就是多少,如果小数点从右往左,那就是负指数)
比如我要存储9.0,那我就要把它写成浮点数二进制表达形式
1001.0
-1^ 0 *1.001 2 ^2 *3-----9.0
首先,E为一个无符号整数(unsigned int)
这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们 知道,科学计数法中的E是可以出 现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数 是127;对于11位的E,这个中间 数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即 10001001。
e不为全0或者全1的时候
这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将
有效数字M前加上第一位的1。 比如: 0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为 1.0*2^(-1),其阶码为-1+127=126,表示为 01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进 制表示形式为
E全为0
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值, 有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于 0的很小的数字。
浮点数的形式放进去就要用浮点型的形式来取,不能以其他形式来取,不然会出现问题