数据类型
char
short
int
long
long long
float
double
1.类型的基本介绍
类型的意义
1.所开辟的空间大小 2.如何看待内存空间的视角
1.1整型家族:
char (字符的本质是ASCII码值,是整型) char不清楚是signed char 还是unsigned char unsigned char signed char short unsigned short signed short int (默认为 signed) unsigned int signed int long unsigned long signed long
1.2浮点型家族:
float-单精度 double-双精度
1.3构造类型:
自定义类型-可以自己创建出新的类型
数组类型 结构体类型 枚举类型 联合类型
去掉名称剩余的就是新类型
int arr[10]; int[10]; char ch[10]; char[10];
1.4指针类型:
int* char* float* void*
1.5空类型:
void表示空类型(无类型) 通常用于返回类型,函数的参数,指针类型。
2.整型在内存中的存储
数值有不同表示形式 10 //2进制 0b1010 //8进制 012 //16进制 0xa //十进制 10
整数的2进制表示有三种表示形式
原码,反码,补码 1.正的整数,原码,反码,补码相同 2.负的整数,原码,反码,补码通过计算得到 原码:直接通过二进制形式写出二进制序列 反码:原码符号位不变,其余位按位取反 补码:反码+1
整数以补码形式在内存中保存 内存以十六进制展示
二进制与十六位进制转换->每四个二进制数转换成一个十六位进制数
#include<stdio.h> int main() { int a = -10; //1000 0000 0000 0000 0000 0000 0000 1010 -原码 //0x8000000a //1111 1111 1111 1111 1111 1111 1111 0101 -反码 //0xfffffff5 //1111 1111 1111 1111 1111 1111 1111 0110 -补码 //0xfffffff6 int b = 10; //0000 0000 0000 0000 0000 0000 0000 1010 -原码=反码=补码 //0x0000000a return 0; }
内存中存储的的确是补码,不过顺序有点有点问题
接下来介绍大小端进行解释
大小端存储
大端字节序存储: 数据中的低位存储在内存中的高地址,数据中的高位存储在内存中的低地址 小端字节序存储: 数据中的低位存储在内存中的低地址,数据中的高位存储在内存中的高地址
写段代码,判断当前机器的存储类型
#include<stdio.h> int Check() { int a = 1; // 0x 00 00 00 01 小端存储 // 0x 01 00 00 00 大端存储 char* p = (char*)&a;//取出第一个字节进行判断 if (*p == 1) return 1; else return 0; } int main() { int ret = Check(); if (ret == 1) { printf("小端"); } else { printf("大端"); } return 0; }
signed char 与 unsigned char 取值范围
#include<stdio.h> int main() { char a = -1; //10000000000000000000000000000001 原码 //11111111111111111111111111111110 反码 //11111111111111111111111111111111 补码 //截断 //在char中的存储 11111111 // 整型提升 按符号位进行提升 1 //11111111111111111111111111111111 补码 // 原码 10000000000000000000000000000001 signed char b = -1; //10000000000000000000000000000001 //11111111111111111111111111111110 //11111111111111111111111111111111 //截断 //在char中的存储 11111111 // 整型提升 按符号位进行提升 1 //11111111111111111111111111111111 -1 //原码 10000000000000000000000000000001 unsigned char c = -1; //10000000000000000000000000000001 //11111111111111111111111111111110 //11111111111111111111111111111111 //截断 //在char中的存储 11111111 // 整型提升 按符号位进行提升 0 // 00000000000000000000000011111111 补码 // 原码 00000000000000000000000011111111 printf("a=%d b=%d c=%d", a, b, c); return 0; }
浮点型在内存中的存储
存储时
任意二进制浮点数都可以表示成以下形式 (-1)^ s * M * 2 ^ E (-1)^s 表示符号位 s=0 为正数;s=1 为负数 M表示有效数字,大于等于1小于2 2^E表示指数位 eg: 十进制 5.0 二进制表示形式为 101.0 ->1.01* 2 ^2 在内存中的存储形式为 (-1)^0 * 1.01 * 2^2
对于32位的浮点数,最高的1位是符号位,之后是8位的指数位,剩下的23位为有效位。
特殊规定
M 计算机保存M是默认第一位总是1,因此可以舍去 读取时再加上 E计算机保存E时先加上一个中间值 127(32位浮点数)
取出时
1E不全为0或不全为1减去127即可 2.E全为0,M不再加上1,以此表示接近于0的数字 3.E全为1,接近于无穷大 eg: 5.5 的二进制位表示形式为 101.1 (-1)^0 *1.011 *2 ^2 S=0 M=1.011 E=2 2+127=129 -> 1000001 0 1000001 011000000000000000000000
实例
#include<stdio.h> int main() { int i = 9; //0 00000000 00000000000000000001001 补码 float* p = (float*)&i; printf("i的值:%d\n",i);//9 printf("*p的值:%f\n", *p);// 0.000000 // (-1)^0 *0.0000000000000000001001*2^-126 *p = 9.0; //1001.0 //1.001*2^3 //(-1)^0*1.001*2^3 3+127=130 ->10000001 //0 10000001 00100000000000000000000 printf("i的值:%d\n", i); printf("*p的值:%f\n", *p); return 0; }