目录
数据类型详细介绍
数据类型介绍
数据类型的基本归类
整型在内存中的存储
原码、反码、补码
编辑
大小端介绍
例题
浮点型在内存中的存储
常见的浮点数
浮点数存储的例子(具体解析浮点数存储)
解析最初的例题
数据类型详细介绍
数据类型介绍
char //字符数据类型
short //短整型
int //整型
long //长整型
long long //更长的整型
float //单精度浮点数
double //双精度浮点数
类型的意义:
1.使用这个类型开辟内存空间的大小(大小决定了使用范围)
2.如何看待内存空间的视角
数据类型的基本归类
整型家族:
char //底层存储的是ASCII码值,也是个整数unsigned charsigned char
shortunsigned short[int]signed short[int]
int unsigned intsigned int
longunsigned long[int]signed long[int]
浮点数家族:
float
double
构造类型:
数组类型
结构体类型 struct
枚举类型 enum
联合类型 union
指针类型:
int* pi;
char* pc;
float* pf;
void* pv;
空类型:
void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型
整型在内存中的存储
原码、反码、补码
计算机中的有符号数有三种表示方法,即原码、反码和补码
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位三种表示方法各不相同。
原码:
直接将符号数按照正负数的形式翻译成二进制就可以
反码:
将原码的符号位不变,其他位依次按位取反就可以得到了。
补码:
反码+1就得到补码
正数的原码、反码、补码都相同
对于整型来说:数据存放内存中其实存放的是补码
下图为-10在内存中的补码表示(16进制、小端存储):
大小端介绍
什么是大端小端:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中
大小端存在的原因:
如何判断当前机器的字节序(大小端):
//判断当前机器的字节序
int main() {int a = 1;//小端为01 00 00 00,大端为00 00 00 01char* p = (char *)&a;//&a为int*型,需要强制类型转换,char类型指针正好访问第一个字节if (*p == 1) {printf("小端");}else{printf("大端");}return 0;
}
例题
//输出什么?
int main() {char a = -1;//原码:10000000000000000000000000000001//反码:11111111111111111111111111111110//补码:11111111111111111111111111111111//11111111(char只存一个字节,后八位)//发生整型提升:11111111111111111111111111111111=-1signed char b = -1;//11111111(char只存一个字节,后八位)//发生整型提升:11111111111111111111111111111111=-1unsigned char c = -1;//11111111(char只存一个字节,后八位)//发生整型提升:00000000000000000000000011111111=255(无符号高位补0)//正数原码补码相同printf("a=%d,b=%d,c=%d", a, b, c);//-1 -1 255return 0;
}
int main() {char a = -128;//10000000000000000000000010000000(原)//11111111111111111111111101111111(反)//11111111111111111111111110000000(补)//char-10000000//整型提升11111111111111111111111110000000printf("%u\n", a);//%u无符号十进制数字(原补码相同)//11111111111111111111111110000000=4,294,967,168return 0;
}
int main() {char a = 128;//超出范围,发生截断//00000000000000000000000010000000(原)//char-10000000=-128//整型提升11111111111111111111111110000000printf("%u\n", a);//%u无符号十进制数字//11111111111111111111111110000000=4,294,967,168return 0;
}
int main() {int i = -20;//10000000000000000000000000010100//11111111111111111111111111101011//11111111111111111111111111101100unsigned int j = 10;//00000000000000000000000000001010printf("%d\n", i + j);//11111111111111111111111111110110(补码)//11111111111111111111111111110101(反码)//10000000000000000000000000001010(原码)=-10return 0;
}
int main() {unsigned int i;for (i = 9; i >=0; i--) {printf("%u\n", i);}//死循环,因为判断条件有=0,而无符号整型永远不会<0return 0;
}
int main() {char a[1000];//char类型取值范围(-128~127)/(10000000~01111111)int i;for (i = 0; i < 1000; i++) {a[i] = -1 - i;}//-1 -2 -3 ...-127 -128 127 126...3 2 1 0 -1 -2 ...printf("%d", strlen(a));//访问到0即\0,会停止访问,所以输出128+127=255return 0;
}
unsigned char i = 0;//unsigned char取值范围(0~255)(00000000~11111111)
int main() {for (i = 0; i <= 255; i++) {//永远小于等于255,陷入死循环printf("hello world\n");}return 0;
}
浮点型在内存中的存储
常见的浮点数
3.14159 1E10浮点数家族包括:float、double、long double类型。浮点数表示的范围:float.h中定义
浮点数存储的例子(具体解析浮点数存储)
//浮点数和整数在内存中的存储有区别
int main() {//整数的形式存储,浮点数的形式读取int n = 9;float* pFloat = (float*)&n;printf("n的值为:%d\n", n);//9printf("pFloat的值为:%f\n", *pFloat);//0.000000//浮点数的形式存储,整数的形式读取*pFloat = 9.0;printf("n的值为:%d\n", n);//1091567616printf("pFloat的值为:%f\n", *pFloat);//9.000000return 0; }
原因(此题下方有具体解析):
例:
int main() {float f = 5.5f;//101.1//1.011 * 2^2//s=0 M=011 E=2//s=0 M=011 E=2+127////0100 0000 1011 0000 0000 0000 0000 0000//40 b0 00 00return 0;}
然后,指数E从内存中取出还可以再分成三种情况:
解析最初的例题
int main() {int n = 9;//00000000000000000000000000001001float* pFloat = (float*)&n;printf("n的值为:%d\n", n);//9printf("pFloat的值为:%f\n", *pFloat);//0.000000//00000000000000000000000000001001(内存认为是浮点数存储形式)//0(s) 00000000(E) 00000000000000000001001(M)//E为全0 +0.00000000000000000001001*2^(-126)//只打印小数点后6位*pFloat = 9.0;//1001.0//1.001*2^3 E=3//0(s) 10000010(E) 00100000000000000000000(M)printf("n的值为:%d\n", n);//1091567616//01000001000100000000000000000000(内存认为是整数数存储形式)//01000001000100000000000000000000=1,091,567,616(正数补码与原码相同)printf("pFloat的值为:%f\n", *pFloat);//9.000000return 0;}