书接上回,基础知识梳理
数的范围
- 对于一个字节(8位), 可以表达的是:
- 00000000 - 11111111
- 其中
- 00000000 ——> 0
- 11111111 ~ 10000000 ——> -1 ~ -128
- 00000001 ~ 011111111 ——> 1 ~ 127
整数的范围 - char : 1字节: -128 ~ 127
- short : 2字节: -32768 ~ 32767
- int 取决于编译器(CPU) , 通常的意义是“ 1个字节 ”
- long : 4个字节
- long long : 8个字节
unsigned
- 如果一个字面量常量数想要表达自己是unsigned , 可以在后边加u或者U
- 255U
- 用 l 或者L 表示long(long)
- unsigned 的初衷并非扩展数能表达的范围,而是为了做纯二进制运算,主要是为了移位
整数越界
- 整数是以纯二进制方式进行计算的, 所以:
- 11111111 + 1——> 10000000——> 0
- 01111111 + 1 ——> 10000000——> -128
- 10000000 - 1——> 01111111 ——>127
探索int数据类型最大数与最大数位
我们可以用一个程序来实现这个测试,代码如下:
#include <stdio.h>
int main(){
int a = 0 , b = 0;
while (++a>0)
;
printf("int数据类型最大数是:%d\n",a-1);
b++;
while ((a=a/10)!=0)
{
b++;
}
printf("int数据类型最大的数的数位是:%d\n", b);
return 0;
}
它的运行结果是:
int数据类型最大数是:2147483647
int数据类型最大的数的数位是:10
整数的格式化
整数的输入输出
- 只有两种形式:int 或者long long
- %d : int
- %u : unsigned
- %ld : long long
- %lu : unsigned long long
8进制和16进制
- 一个以0开始的数字字面量是8进制
- 一个以0x开始的数字字面量是16进制
- %o用于8进制, %x用于16进制
- 8进制和16进制只是如何把数字表达为字符串,与内部如何表达数字无关
- 16进制很适合表达二进制数据,因为4位二进制正好是一个16进制位
- 8进制的一位数字正好表达3位二进制
- 因为早期计算机的字长是12的倍数,而非8的倍数
选择整数类型
- 为什么整数要有那么多种?
- 为了准确表达内存, 做底层程序的需要
+ 没有特殊需要,就选择int
现在的CPU的字长普遍是32位或者64位,一次内存读写就是一个int,一次计算也是一个int,选择更短的类型不会更快,甚至可能更慢
现在的编译器一般会设置内存对齐,所以更短的类型实际在内存种有可能也占据一个int的大小(虽然sizeof告诉你更小)
unsigned 与否只是输出的不同,内部计算是一样的
浮点类型
类型 | 字长 | 范围 |
---|---|---|
float | 32 | 7 |
double | 64 | 15 |
浮点的输入输出
类型 | scanf | printf |
---|---|---|
float | %f | %f,%e |
double | %lf | %f,%e |
科学计数法
-5.67E+16
从前往后依次解释
- 可以选择的+ 或者- 符号
- 小数点也是可以选择写或者不写的
- E可以用e或者E
- 第二个符号-或者+也是可以省略的,如果省略的话就表示+了
- 整个词不能有空格噢
输出精度
- 在%和f之间加上.n可以指定输出小数点后几位,这样的输出是做四舍五入的
举例:
#include <stdio.h>
int main()
{
printf("%.3f\n",-0.0049);
printf("%.30f\n",-0.0049);
printf("%.3f\n",-0.00049);
return 0;
}
代码执行结果如下:
-0.005
-0.004899999999999999800000000000
-0.000
从代码的执行结果我们可以清晰的看出输出精度的应用是怎样的,并且我们应该如何去运用输出精度来达到我们的输出目的。
超过范围的浮点数
- printf输出inf表示超过范围的浮点数:±∞
- printf输出nan表示不存在的浮点数
浮点的运算没有精度噢
浮点数的内部表达
- 浮点数在计算时是由专用的硬件部件实现的
- 计算double和float所用的部件是一样的
选择浮点类型
- 如果没有特殊需要,只使用double
- 现代CPU能直接对double做硬件运算,性能不会比floa差,在64位的机器上,数据存储的速度也不比floa慢
所以我们在选择浮点类型时,一般只使用double类型。