进制转换及运算符与表达式
英文缩写:
Bin:二进制
Oct:八进制
Dec:十进制
Hex:十六进制
add:加
sub:减
mul:乘
div:除
核心已转储:表示程序崩溃了
hour:小时
minute:分钟
second:秒
warning: format ‘%d:占位符用的不对!
回顾:
1.变量
作用:就是为了分配内存
语法格式:数据类型 变量名 = 初始值;
定义形式:四种形式
2.标识符
变量名或者函数名统称标识符
第一个字符不能以数字开头,以字母或者下划线
区分大小写
驼峰和下划线
3.代码风格
该加的空格加空格
该加的TAB键的加TAB键
该独占一行的独占一行
占据屏幕的2/3区域
4.变量的数据类型
作用:预算变量将来分配的内存大小
char/unsigned char/short/unsigned short/int/unsignd int/long/unsigned long/
long long /unsigned long long /float /double
5.字符类型
字符常量用’’
本质是整数,ascii码
%c,%hhd
转义字符
6.int类型
通过short和long修饰可以变形为6中
%d,%ld,%lu等
7.浮点类型
1.23/1.23f
%f,%lf,%g,%lg
8.整型常数
100/100L/100UL/100LL
9.scanf输入函数
格式:scanf(格式,变量地址); char c; scanf(“%c”, &c);printf(“%c %d\n”, c, c);
10.sizeof关键字
获取变量或者数据类型占用的内存大小
格式:大小=sizeof(变量名或者数据类型名)
11.进制转换
11.1.明确:计算机系统中,又将内存的一个字节分为8段,每段只能存0或者1
结论:要想把一个数字存储到字节里,必须首先将这个数字分拆成8个0和1
如果一个数字用一个字节存不下,可能需要两个字节或者四个字节
也就是将这个数字分拆成16个0和1或者32个0和1
所以计算机只认0和1
概念:字节的每一个段有对应的专业术语:bit位,每一段就是一个bit,就是一位
参见:BIT.png图
11.2.二进制
1)概念:采用一组0或者1表示数字的方法叫二进制表示形式
例如:现在有一个数字90(给人看)
如果用二进制表示形式为:01011010(给计算机看)
2)特点
0.二进制和十进制(0,1,2,3,4,5,6,7…)都是表示数字的两种方式
计算机只认二进制,程序员一般用10进制
1.计算机只认二进制数字0和1
2.二进制表示方式里每个数都有一个编号
例如:编号如下:
7 6 5 4 3 2 1 0 编号(以char为前提)(要注意前提)
- 一个字节内部的各个位数有高低位之分,不同字节之间也有高低位之分
- 二进制数
3.二进制表示方式里每个1单独代表一个数字,这个数字的只就是2的编号次方
7 6 5 4 3 2 1 0 编号
0 0 0 1 0 0 0 0
结果:00010000这个二进制数对应的数字是2的4次方=16(10进制)
7 6 5 4 3 2 1 0 编号
0 0 0 1 0 1 0 0
结果:00010100这个二进制数对应的数字是2的4次方+2的2次方=20(10进制)
4.如果两个相邻的二进制内容一样,那么左边的数字是右边数字的2倍
7 6 5 4 3 2 1 0 编号
0 0 0 1 1 0 0 0
结果:第4位的1代表2的4次方,第3位的1代表2的3次方,那么左边是右边的2倍
5.二进制数字加1的时候把编号0位置开始的多个连续的1都变成0,把最左边的0变1
例如:
01011111 + 1 = 01100000
01011110 + 1 = 01011111
7.用二进制表示的非负数(0和正数)去掉最右边的二进制数字结果相当于这个数字除以2并保留 整数部分
例如:
7 6 5 4 3 2 1 0 编号
0 1 1 0 0 1 1 0 二进制数 = 102
0 1 1 0 0 1 1 去掉最右边的0以后的二进制数字 = 51
3)二进制和十进制之间的转换
1.二进制表示的非负数转成十进制的时候就是把每个二进制位的内容单独转换然后求和
例如:
76543210 二进制数编号
01101001 二进制表示形式
结果:转成十进制之后的数值=2的6次方+2的5次方+2的3次方+2的0次方
=64+32+8+1=105,显然这个数字用1个字节可以存下
例如:假如有一个10进制数非常大,显然用char和unsigned char 1字节存不下,用2字节存
于是乎需要将这个数分拆16位,如下:
1514131211109876543210 二进制数编号
0 1 1 0 1 0 1100000011 二进制表示形式
结果:这个数的十进制=2的14次方+….=
2.十进制表示的非负数转二进制
转换过程:采用”除2取余,逆序排列”法。
具体做法是:用2整除十进制整数,可以得到一个商和余数;
再用2去除商,又会得到一个商和余数,
如此进行,直到商为小于1时为止,然后把先得到的余数 作为二进制数的低位(0开始),后得到的余数作为二进制数的高位,依次排列起来。
例如:91这个十进制转二进制
91/2=45 余1
45/2=22 余1
22/2=11 余0
11/2=5 余1
5/2=2 余1
2/2=1 余0
1/2=0 余1
0/2=0 余0
结果:91二进制数=01011011
如:255转二进制
255/2=127=====余1
127/2=63======余1
63/2=31=======余1
31/2=15=======余1
15/2=7========余1
7/2=3=========余1
3/2=1=========余1
1/2=0=========余1
结果:255二进制=111111111
789二进制为:1100010101
789/2=394 余1
394/2=197 余0
197/2=98 余1
98/2=49 余0
49/2=24 余1
24/2=12 余0
12/2=6 余0
6/2=3 余0
3/2=1 余1
1/2=0 余1
一定要算到商为0的时候
这里可以类比到二进制数右移,右移一位后保留的数就是这里的商。被移除的最低位的数就是这里的余数
3.负数的十进制和二进制之间不可直接转换,必须借助相反数
负数的十进制转二进制的步骤,三步骤:
1.首先计算出负数的相反数
2.然后把得到的相反数转换成二进制数
3.最后对转换之后的二进制数据取反(1->0,0->1)后再加1
例如:-14转二进制**
1.计算相反数:14
2.转成14的二进制:00001110
3.取反加1:11110001 + 1 = 11110010
负数二进制转换为十进制:减1 二进制取反 再取相反数
4.有符号类型数字采用符号
二进制数字最左边的位叫符号位
它的值可以用来确定数字的符号
符号位的值是0表示这个数字是非负数(0或者正数)
符号位的值是1表示这个数字是负数
例如:现在有这么一个8位的二进制数:01011010,此二进制对应的十进制数为非负数
现在有这么一个8位的二进制数:11011010,此二进制对应的十进制数为负数
现在有这么一个16位的二进制数:
0101010101011010,此二进制对应的十进制数为非负数
现在有这么一个16位的二进制数:
1101010101011010,此二进制对应的十进制数为负数
现在有这么一个16位的二进制数:
01011010,此二进制对应的十进制数为非负数 //高8位都是0
现在有这么一个16位的二进制数:
11011010,此二进制对应的十进制数为非负数 //高8位都是0
现在有这么一个16位的二进制数:
1111111111011010,此二进制对应的十进制数为负数
例如:
目前有这么一个二进制数是:10110110(前提是:如果作为字符类型数字此数必然是负数)
要求计算这个二进制对应的十进制的负数为:
1.先求反在加1:01001001 + 1 = 01001010
2.然后计算转换之后的二进制对应的十进制
01001010=2的6次方+2的3次方+2的1次方=74
3.最后求相反数结果为-74
4)二进制和八进制的故事
1.八进制定义:就是把二进制数字从右到左每三个数为一组
每组用一个0和7之间的数字替换得到8进制表示形式
例如:
原始二进制数:01101010
按照8进制分组:01 101 010
然后对分组的数求值:
01=2的0次方=1
101=2的2次方+2的0次方=5
010=2的1次方=2
结果是01101010二进制数对应的八进制数为152(八进制)
2.八进制特点
程序中可以直接使用八进制数,但是这种数字必须以0开头(例如:0152)
对应的占位符是0%o,将来在屏幕上就可以看到这个八进制数的形式
例如:
int a = 106; //10进制数
printf(“十进制数值是:%d,其八进制数值是:0%o\n”, a, a);
5)二进制和十六进制的故事(核心中的核心)
1.定义:把二进制数所有的位数从右到左每4位为一组
每组用一个字符替换(用a到f之间的字母替换10~15之间数字)
这种表示方式简称十六进制
注意:16进制数必须以0x开头,不用区分大小写
结论:程序中将来所有的二进制建议都是以16进制形式表示,不建议用10进制和8进制
例如:
原始二进制:11000101
分组:1100 0101
换算 : 12 5
替换 c 5
结果:此二进制对应的16进制为0xc5
2.特点
1.必须以0x或者0X开头
2.占位符:%#x(字母按小写显示)/%#X(字母按大写显示)
3.切记:务必拿下二进制和十六进制的转换,开发必用!
例如:背下来,否则遭鄙视
十六进制 二进制
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
a 1010
b 1011
c 1100
d 1101
e 1110
f 1111
例如:
二进制 十六进制
11000101 0xc5
01011010 0x5A
11000011 0xc3
0001 1000 0101 1110 0x185e
十六进制 二进制
0xa54 1010 0101 0100
0xb8 1011 1000
0x5a69cd38 0101 1010 0110 1001 1100 1101 0011 1000
3.总结:程序中不管用10进制也好,8进制也好,还是16进制也是,他们都是对内存中
存储的二进制数的不同表达方式而已,不管哪种方式,最终内存存的二进制数都是一样的
12.运算符和表达式
12.1.定义
运算符:就是对内存中的数据进行操作的符号,例如:加法运算符+
表达式:就是数据和运算符结合起来的式子,例如:1+2
1.2.C语言相关的运算符
1)算数运算符:加减乘除取余:+,-,*,/,%
注意:
1.如果参与除法运算的两个数字都是整数则计算结果只保留整数部分,例如:5/2=2
2./和%不能对整数0进行操作,否则程序中断失败,例如:5/0:报错
3.%不能用于浮点数,例如:5%1.2,报错
4.%的结果与其左边的数字的符号一致,例如:-7%2=-1 7%-2=1
5./如果除数为浮点数,最后得到inf无穷大
案例:输入一个秒收,打印对应的小时,分钟和秒数
例如:3600->1小时0分0秒
3601->1小时0分1秒
公式:
小时=秒数/3600
分钟=秒数%3600/60
秒=秒数%60
2)赋值运算符:”=”
功能:将运算符右边的数字给左边的变量
形式1:
int a;
a = 10;
形式2:
int a, b, c;
a = b = c = 0x10;
2.切记:赋值运算符”=”不是”==”
3.赋值运算符和其他运算符结合起来使用,构成复合运算符
例如:
a += b; //a = a + b;
a -= b; //a = a-b
a = b; //a = ab;
a /= b; //a = a/b;
a %=b; //a = a%b;
等等
4.不能给常量和表达式赋值
例如:100 = 200; //报错
100 = a; //报错
a + b = c; //报错