day2 C 数据类型 运算符 和 表达式
一. C语言的数据类型:整型,浮点型,字符型,构造类型,指针类型,空类型,此处细讲前三种数据类型。
1. 整型常数,主要运用的事十进制,八进制,十六进制的常量形式。在计算机中最终存储的是二进制形式。进位为(满几进几)
2.其中8421BCD码,可快速写出十进制对应的二进制编码和格雷码。
3. 十六进制与二进制互相转化,方法:一位十六进制数对应四位二进制数。
eg: 0 --- 000
1 --- 001 2 --- 010 3 --- 011
4 --- 100 5 --- 101 6 --- 110
7 --- 111 8 ... a b c d f ... 1111
eg: 7 B
0111 1011
二:整型变量
1. 起变量名也有规则:
1. 数字,字母,下划线
2. 不能是数字开头
3. 字母区分大小写
4. 名字 不能与 关键字 重名
5. 不要 和 库函数 重名 (eg: include等)
6. 不要 和 预处理命令等 二级关键字 重名
2. 数据类型的大小(占用内存空间的字节数)
sizeof(int) = 4
sizeof(short) = 2
sizeof(long) = 8
sizeof(long long) = 8
我们也可以用代码查看数据类型的大小
int main()
[
printf("sizeof(float) = %ld\n",sizeof(int));
return 0;
]
此外通过这种方式也可以查看(int)( short)( long)( long long)的数据类型大小。
3. 整型数据存储:32bit =4*8bit;(4bytes)
有两种方式 :大端和小端,其中小端遵循高位数据存储在高地址处 ,低位数据存储在低地址处的方式,pc端也是小端的一种,另外arm内核芯片默认为小端,也可以设置为大端。
4. 符号类型和无符号类型 signed和unsigned,后接数据类型即可表示相对应的类型
eg:unsigned int //无符号的 int类型 signed int //有符号的 int类型
无符号类型
0000 0000 0000 0000 0000 0000 0000 0000 //数值位
有符号类型
0 | 000 0000 0000 0000 0000 0000 0000 0000 //数值位
无符号类型无法表示正负,故用有符号类型
其中有符号类型较为特殊 ,最高位充当符号位(0为正数,1为负数),其他位充当数值位
eg:int a = 123;
0000 0000 0000 0000 0000 0000 0111 1011 // -- 原码
0000 0000 0000 0000 0000 0000 0111 1011 // -- 反码
0000 0000 0000 0000 0000 0000 0111 1011 // -- 补码
0 0 0 0 0 0 7 B
int a = -123
有符号类型
1 | 000 0000 0000 0000 0000 0000 0111 1011 // -- 原码
1 | 111 1111 1111 1111 1111 1111 1000 0100 // -- 反码 --- 符号位不变,其余位按位取反
1 | 111 1111 1111 1111 1111 1111 1000 0101 // -- 补码 --- 符号位不变,反码 + 1
1111 1111 1111 1111 1111 1111 1000 0101
f f f f f f 8 5
其中负数运算逻辑为模减去负数的绝对值
eg:12 -5 = 12- |-5| = 7
结论:整数存在计算中的都是补码,其中正整数的原码,反码,补码都是一样的,
负整数的补码等于反码+1;
5. 数据的取值范围
eg :0000 0000 0000 无符号类型的最大值为2^12-1,最小值为0;
有符号类型
0 | 000 0000 0000 0000 0000 0000 0000 0000 //最小值0
0 | 111 1111 1111 1111 1111 1111 1111 1111 //最大值 2^31 - 1
1 | 000 0000 0000 0000 0000 0000 0000 0000 //最小值 -2^31
1 | 111 1111 1111 1111 1111 1111 1111 1111 //最大值 - 1
有符号类型的一种情况
eg:1 | 000 0000 0000 0000 0000 0000 0000 0000 //补码
1 | 111 1111 1111 1111 1111 1111 1111 1111 // 反码
1 | 000 0000 0000 0000 0000 0000 0000 0000 // 原码 最小值为-2^31
其中当是有符号类型时候,最高位既充当符号位,有充当数值位
unsigned short [0,2^16-1] [0~65,535]
signed short [-2^15,2^15-1] [-32,768,32767]
6. ※ 整型溢出
整型溢出
最大值 + 1 //变成 取值范围内 最小值 -- 向上溢出
最小值 -1 //变成 取值范围内 最大值 --- 向下溢出
其中溢出可以想象一个圆,是一个循环,当过终点的同时也从起点出发
三.
浮点类型:
1.浮点型 常量形式
1.234
1.23e4 //科学计数法形式
1.23E4 //1.23 * 10 ^4
1.23E-4 //1.23 * 10^-4
2. 关键字
float //单精度浮点类型
double //双精度浮点类型
3. float f; //定义了一个 float 类型的变量 f
4.浮点类型的大小
float 4字节
double 8字节
其中对于实操代码中,如果float了一个f,就直接printf(“f”)是不一样,虽然能够运行,但是2这个的类型不同,float f的定义f为定义的float类型,但是直接printf默认为double类型,二者并不一样。
5. 浮点数的存储
IEEE 754标准
float f = 6.125;
step1: 将十进制形式的小数 转换为 二进制形式的小数
整数部分
除2取余法
小数部分
乘2取整法
0.125 * 2 = 0.25 --- 0
0.25 * 2 = 0.5 --- 0
0.5 * 2 = 1.0 --- 1
0.125 二进制形式 0.001
0110.001 //二进制形式的小数
step2: 将 二进制形式小数 ,写成科学计数法形式
123.45 => 1.2345*10^2
0110.001 => 1.10001 * 2^2
step3: 按IEEE 754标准进行存储
float 占 4字节
1 8 23
符号位|指数位|尾数位
0 2 10001
+127
-127
+128
0 10000001 10001
0100 0000 1100 0100 0000 0000 0000 0000 //6.125 存到计算机中的形式
4 0 c 4 0 0 0 0
其中代码中有循环存在,判断循环后的浮点类型是否与循环前所给的字符相等,首先确认他是否为无限循环
eg:小数部分距离
0.9 * 2 = 1.8 --- 1
0.8 * 2 = 1.6 --- 1
0.6 * 2 = 1.2 --- 1
0.2 * 2 = 0.4 --- 0
0.4 * 2 = 0.8 --- 0
0.8 * 2 = 1.6 --- 1
0.6 * 2 = 1.2 --- 1
可见,已经出现循环,又由于printf默认为double,所以循环之后的浮点类型与循环之前随给的字符是不一样的。
四. 字符型,
char 类型 从本质上看 实际上也是一种整型
char 类型 --- tiny int
小练习
eg:定义五个char类型变量 分别赋值为 'h','e','l','l','o' 要求, 输出 成 HELLO
#include<stdio.h>
int main()
{
char ch1 = 'h';
char ch2 = 'e';
char ch3 = 'l';
char ch4 = 'l';
char ch5 = 'l';
printf("%c",ch1 - 32);
printf("%c",ch1 - 32);
printf("%c",ch1 - 32);
printf("%c",ch1 - 32);
printf("%c",ch1 - 32);
return 0;
}