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的很小的数字。





浮点数的形式放进去就要用浮点型的形式来取,不能以其他形式来取,不然会出现问题