浮点型(实型):float,double
用来存储小数数值
- 单精度浮点型float
- 双精度浮点型double
- double比float更精确
#include <stdio.h>
int main()
{
float a =3.14f;
double b =3.14;
printf("%,2f\n",a);
printf("%f\n",b);
return 0;
}
由于浮点型变量是由有限的存储单元构成,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。
不以f为结尾的常量是double 类型,以f为结尾的常量是float类型
*浮点型数据 存储在内存中的格式分为符号位 指数位 小数位
//sizeof字节大小
printf("%d\n",sizeof(float)");
printf("%d\n,sizeof(double)");
%p:以十六进制形式显示数据内存地址
占位符 表示输出一个变量对应的内存地址编号(无符号十六进制整型数)
科学计数法
a=3.2e3f; 3.2*1000=3200,e可以写E
printf(“a1=%f\n”,a);
#include<stdio.h>
int main(void)
{
float b =3.2e3f;
printf("%f\n",b);
return 0;
}
#include <stdio.h>
int main(void)
{
float a =0.123456;
printf("%e\n",a);
return 0;
}
进制
二进制:c语言不能直接写二进制
它的基数是2,进位规则是“逢二进一”,借位规则是”借一当二”。
十进制转化为二进制
(除二反序余法)
10➗2=5…0
5➗2=2…1
2➗2=1…0
1➗2=0…1
十进制10转成二进制1010
二进制转成十进制
(权值法)
1 0 1 0
02^0=0
12^1=2
02^2=0
12^3=8
0+2+0+8=10
将一个二进制数依次从末尾开始乘2的n次幂,n从0开始。
十进制转成八进制
(除八反序取余法)
123➗8=15…3
15➗8=1…7
1➗8=0…1
得173
4567➗8=570…7
570➗8=71…2
71➗8=8…7
8➗8=1…0
1➗8=0…1
十进制4567转成八进制是10727
八进制转成十进制
(权值法)
1 7 3
38^0=3
78^1=56
1*8^2=64
3+56+64=123
1 0 7 2 7
78^0=7
28^1=16
78^2=448
08^3=0
1*8^4=4096
7+16+448+4096=4567
十进制和十六进制
(除十六反序取余法)
123➗16=7…11
7➗11=0…7
十进制123转成16进制是7b
4567➗16=285…7
285➗16=17…13 d
17➗16=1…1
1➗16=0…1
十进制4567转成十六进制11d7
十六进制转换成十进制(权值法)
7 11
1116^0=11
716^1=112
11+112=123
1 1 13 7
716^0=7
1316^1=208
116^2=256
116^3=4096
7+208+256+4096=4567
``二进制 八进制 十六进制
十进制 二进制 八进制 十六进制
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 18 108
十进制为2的几次方,则二进制中就有多少个零
211=128+64+16+2+1
得11010011
( 八四二一法则)
二进制转八进制三位一格
1 1
10 2
100 4
1000 10
10000 20
…
例如:10011010 233
八进制转二进制与之相反
不够三位用零补位
534235172345
101 011 100 010 011 101 001 111 010 011 100 101
二进制与十六进制(四位一格)同上
例题:将八进制的567转为十六进制
567(先转为二进制)101 110 111
(再转为十六进制)1 0111 0111即为177
例题:将十六进制的3F2D9B73C转为八进制
(先转为二进制)0011 1111 0010 1101 1001 1011 0111 0011 1100
(再转为八进制)176266333474
八进制:以数字零为开头
十六进制:以0x为开头
小数存储方式
十进制的小数转换成二进制:小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果。
0.4322=0.846 取整为0
0.8462=1.728 取整为1
1.728*2=1.456 取整为1
结果为011;
0.432只有3位,故只需3位
乘的时候只乘小数部分
在c语言中的进制表现形式有3种,分别是8,10,16,进制
sizeof用于计算字节大小
计算机内存数值存储方式
原码:原始二进制码,本身转换方便,但不便于加减运算。
- 最高位作为符号位,0代表正,1代表负
- 其他数值部分就是数值本身绝对值本身绝对值的二进制数
- 负数的原代码是在其绝对值的基础上,最高位变为1
例如:十进制数 原码
+15 0000 1111
-15 1000 1111
char ch =10;
0000 1010
反码:* 对于正数,反码与原码相同,但对于负数来说,符号位不变,其他部分取反(1变0,0变1),也不方便.
原码:1000 1010 0000 1010
反码:0111 0101 0000 1010
补码
在计算机系统中,一律采用补码来存储
特点
- 对正数来说,原码,反码,补码相同;
- 对负数来说,其补码为它的反码加一
补码 :0111 0110 0000 1010
主要原因:
- 统一了0的编码
- 将符号位和其他位统一处理
- 将减法运算转变成加法运算
- 两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃
例如:76-32
76:原码反码补码:0100 1100
-32:原码:1010 0000
反码:1101 1111
补码:1110 0000
补码相加:1 0010 1100
补码:0010 1100
反码:0010 1100
原码:0010 1100
得:44
76-82
76同上,-82:
原码:1010 1010
反码:1101 0101
补码:1101 0110
补码相加:1111 1010
反码:1111 1001
原码:1000 0110
得:-6
8bit数据中最大存储值位???
0111 1111(127)方法:+1法:1000 0000 -1 =2^7-1
最小值:1111 1111(-127)
数据存储时将-0对应的区间值设为最小值 -2^7
8bit数据区间位(-128~127);
有符号的字符型取值范围(-128~127)
有符号的int 32bit -2的31次幂~2的31次幂-1
(-2147483648~2147483647)
有符号的long long 64bit -2的63次幂~2的63次幂-1
无符号
数据存储在计算机中不存在符号位
unsigned char
1111 1111 2^8-1
0000 0000 0
unsigned char 0~255
unsigned int 0~2^32-1
(0~4294967295)
short 2字节 -32768~32767(-2的15次幂到2的15次幂-1)
unsigned short 2字节 0~2^16-1
long 4字节 0 到4294967295(0~2^32-1);
数值溢出
char ch=127;
ch=ch+2;
127原码补码:0111 1111
2原码补码:0000 0010
相加补码:1000 0001
反码:1000 0000
原码:1111 1111=-127
符号位溢出会导致数的正负发生变化,但最高位的溢出会导致最高位丢失
例题:short a=0x7fff+2
三码一致:
0111 1111 1111 1111
2:三码一致:0000 0000 0000 0010
相加得1000 0000 0000 0001
反码:1000 0000 0000 0000
原码:1111 1111 1111 1111(-32767)
例题:unsigned short a=0xffff+5
补码:1111 1111 1111 1111
补码:0000 0000 0000 0101
相加得:1 0000 0000 0000 0100(得4)