1.基本数据类型
自己电脑亲测!
类型 | 关键字 | 字节数 | 位数 | 取值 |
---|---|---|---|---|
整型 | [singned] short | 2 | 16 | -32768~32767 |
[singned] int / long | 4 | 32 | -214783648~2147483647 | |
[singned] long long | 8 | 32 | -9223372036854775808―9223372036854775807 | |
unsingned short | 2 | 16 | 0~65535 | |
unsingned int / long | 4 | 32 | 0~4294967295 | |
unsingned long long | 8 | 32 | 0―18446744073709551615 | |
浮点型 | float | 4 | 32 | ± (3.4×10-38~3.4×1038) |
double / long double | 8 | 64 | ± (1.7×10-308~1.7×10308 ) | |
字符型 | [singned] char | 1 | 8 | -128~127 |
[unsingned] char | 1 | 8 | 0~256 |
2.对2要敏感
十进制数 | 二进制 | 十进制数 | 与2关系 | 十进制数 | 与2关系 |
---|---|---|---|---|---|
0 | 0 | 64 | 26 | 1 | 21-1 |
1 | 1 | 128 | 27 | 3 | 22-1 |
2 | 10 | 256 | 28 | 7 | 23-1 |
3 | 11 | 512 | 29 | 15 | 24-1 |
4 | 100 | 1024 | 210 | 31 | 25-1 |
5 | 101 | 2048 | 211 | 63 | 26-1 |
6 | 110 | 4096 | 212 | 127 | 27-1 |
7 | 111 | 8192 | 213 | 255 | 28-1 |
8 | 1000 | 16384 | 214 | 32767 | 215-1 |
16 | 10000 | 32768 | 215 | 65535 | 216-1 |
32 | 100000 | 65536 | 216 | 4294967295 | 232-1 |
3.整型数据存储方式
1.以按二进制形式存储;
2.以补码形式存放,最高位表示数值的符号(0为正,1为负);
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|
short型首位0,表示正数中的最大值 = 215-1 = 32767;
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|
short型首位1,表示负数中的最小值 = - 215 = - 32768;
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|
unsigned short型没有符号,全部二进制位表示数值本身:最大值 = - 216 - 1 = - 65535;
4.整型数据溢出初探
#include <stdio.h>
int main()
{
short a = 32767;
printf("%hd\n", a + 1);
}
输出结果:
-32768
数据溢出规律:
① 数据最大值 < = > 数据最小值-1;
② 数据最大值+溢出值 < = > 数据最小值+(溢出值-1);
③ 数据类型的首尾形成一个闭环;
5.浮点数的存储原理
浮点数X表示为:X=M×rE
代号 | 名称 | 说明 |
---|---|---|
M | 尾数 | 数 X 的有效数字,其位数反映数据的精度 |
r | 基数, | 十进制的基数为10,二进制的基数为2 |
E | 阶码 | 确定了数 X 的小数点的真实位置 |
类型 | 字节数 | 位数 | 数符S | 阶码E | 尾数M | 取值 | 取值 |
---|---|---|---|---|---|---|---|
float | 4 | 32 | 1位 | 8位 | 23位 | ± (3.4×10-38~3.4×1038) | 精度7位 |
double | 8 | 64 | 1位 | 11位 | 52位 | ± (1.7×10-308~1.7×10308 ) | 精度15位 |
计算float类型数据的取值范围:
①float型,有1位符号位,8位指数位,23位尾数位;
②指数表示范围为-128~127,指数最大为127;
③尾数最大为+1.11…(点后23个1,转10进制数为1.8388607);
④1.8388607×2127 ≈ 2×2127 = 3.4×1038,负数亦然.
浮点数精度问题
#include <stdio.h>
int main()
{
double a, b, c;
a = 1234567890.123456789;
b = 987654321.987654321;
c = a + b;
printf(" %22.9lf\n", a);
printf("+ %22.9lf\n", b);
printf("------------------------\n");
printf("= %22.9lf\n", c);
return 0;
}
输出结果:
1234567890.123456717
+ 987654321.987654328
------------------------
= 2222222212.111111164
#include <stdio.h>
int main()
{
double a = 0.65f;
double b = 0.6f;
double c = a - b;
if (c == 0.05)
printf("对了!\n");
else
printf("错了!\n");
printf("%10.8lf\n%10.8lf\n", a, b);
return 0;
}
输出结果:
错了!
0.64999998
0.60000002