整型
数据类型 | 所占字节 | 表示范围 |
---|---|---|
(singned)int | 4 | - 2 31 2^{31} 231 —— 2 31 2^{31} 231-1 |
(singned)short | 2 | - 2 15 2^{15} 215 —— 2 15 2^{15} 215-1 |
(singned)long | 4(64位为8字节) | - 2 63 2^{63} 263 —— 2 63 2^{63} 263-1 |
unsigned int | 4 | 0—— 2 32 2^{32} 232-1 |
unsigned short | 2 | 0——65535 |
unsigned long | 4(64位为8字节) | 0—— 2 64 2^{64} 264-1 |
那么来看一下溢出的情况,以有符号位短整型为例(-32768——32767)
#include <stdio.h>
int main(){
short i = 32767;
short n = i+1;
short m = i+2;
printf("%d\n",n);
printf("%d\n",m);
return 0;
}
//运行结果
//-32768
//-32767
浮点型
数据类型 | 位数 | 有效数字 |
---|---|---|
float | 32 | 6~7位 |
double | 64 | 15~16位 |
我们通过float关键字或double关键字进行浮点型变量定义,float类型占据4个字节大小的内存空间,double占据8个字节的空间,与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式,指数也有符号位。
表示方法:1e-3 (e代表10的幂次,e后面必须是整数)
#include <stdio.h>
int main() {
float i = 1.456;
if (1.456==i) {
printf("相等\n");
}
else {
printf("不相等\n");
}
printf("%f\n", i);
return 0;
}
原因:浮点数在存储的过程中将十进制的0.1456(*10)转换为二进制存储。不相等的原因就在存储转换的过程中,上图中指数部分存的是二进制,而二进制的幂指数, 2 1 2^1 21=2、 2 2 2^2 22=4、 2 3 2^3 23=8、 2 4 2^4 24=16、 2 5 2^5 25=32。没有哪一个2的指数为10,因而在将1.456(十进制)转换为浮点数的过程中,在内部存储的过程中取的是近似值。因而 i != 1.456 虽然输出结果是1.456000,但是结果取的是一个近似值!!!看下图的真实值
那么问题来了,如何判断浮点数相等?!
//用近似值判断!控制精度!
#include <stdio.h>
int main() {
float i = 1.456;
if (i-1.456>-0.000001&&i-1.456<0.000001) {
printf("相等\n");
}
else {
printf("不相等\n");
}
printf("%f\n", i);
return 0;
}
我们知道float类型的有效数字位6~7位,指的是十进制的有效位,而不是上图中存储过程中的23位!!!
再来看一下,float类型中23位的小数部分,转换成十进制 2 23 2^{23} 223=8388608,是7位!但最高位是8!并不是9999999(7个9,最多6个9)所以float的有效位是6~7位!它指的是十进制的!!!
2 23 2^{23} 223=8388608,是7位!但最高位是8!并不是9999999(7个9,最多6个9)所以float的有效位是6~7位!它指的是十进制的!!!