C语言看进制
操作符
1.左移操作符 <<
左边丢弃,右边补零
例:
5 的二进制 00000000 00000000 00000000 00000101
5<<1 00000000 00000000 00000000 00001010 ==> 10
5左移一位,就会变成10.
2.右移操作符 >>
右移操作符有分两种:算数右移和逻辑右移.
算数右移
右边丢弃,左边补原符号位
例:
5 的二进制 00000000 00000000 00000000 00000101
5>>1 00000000 00000000 00000000 00000010 ==> 2
最左边的第32位补符号位 因为5是正数,所以最左边补0,0代表整数。
反之,出现-5的时候,最左边将会补1,1代表负数。
逻辑右移
右移丢弃,左边补0。
5 的二进制 00000000 00000000 00000000 00000101
5>>1 00000000 00000000 00000000 00000010 ==> 2
不论是+5还是-5,在逻辑右移中,在第32位都会补0。
3.按位与 &
一假为假(其中的操作数必须为整数)
例:
a=3; 00000000 00000000 00000000 00000011
b=5; 00000000 00000000 00000000 00000101
c=a&b; 00000000 00000000 00000000 00000001
1为真,0为假,1&0=0,1&1=1,0&0=0;
所以c=1;
4.按位或 |
一真为真 (操作数必须为整数)
例:
a=3; 00000000 00000000 00000000 00000011
b=5; 00000000 00000000 00000000 00000101
c=a|b; 00000000 00000000 00000000 00000111
1为真,0为假,1|0=1,1|1=1,0|0=0;
所以c=7;
5.按位异或 ^
相同为0,想异为1 (操作数和必须为整数)
例:
a=3; 00000000 00000000 00000000 00000011
b=5; 00000000 00000000 00000000 00000101
c=a^b; 00000000 00000000 00000000 00000110
1为真,0为假,1^0=1,1^1=0,0^0=0;
所以c=6;
6.逻辑与 &&
一假为假,找到一个假的,后面的没有必要进行计算。
int i=0,a=0,b=2,c=3,d=4;
i=a++&&++b&&d++;
printf("%d %d %d %d",a,b,c,d);
打印出来的 a=1,b=2,b=3,d=4
解释:当进行a++的时候,先使用,后++,现使用会出现0,
第一处的a++被解释为0,0为假,所以后面的式子都没有必要进行计算了。
7.逻辑或 ||
一真为真,找到一个真的,后面的没有必要进行计算。
int i=0,a=0,b=2,c=3,d=4;
i=a++&&++b&&d++;
printf("%d %d %d %d",a,b,c,d);
打印出来 a=1,b=3,c=3,d=4
解释 :第一个式子a++先使用后计算,a++在式子中为0,0表示假,向后继续计算,++b先计算后使用,++b在式子中为3,3是非0的数字,所以3表示真,后面的没有必要进行计算。
整形提升
int 占4个字节。
char 占一个字节。
#include<stdioi.h>
int main()
{
char a=3;
char b=127;
char c=a+b;
printf("%d\n",c);
return 0;
}
大家觉得c会等于多少呢?
c=127+3=130?
不不不,c=-126;
解释: char 类型的数据取值范围 -128~127。
int a=3; 00000000 00000000 00000000 00000011
char a=3; 00000011
int b=127; c
char b=127; 01111111
开始提升:按照变量的符号位将进行提升
a 00000000 00000000 00000000 00000011
+
b 00000000 00000000 00000000 00000011
=
c 00000000 00000000 00000000 10000010
因为c是char类型,所以发生截断
C 10000010
对c开始整形提升:按照变量的符号位将进行提升
11111111 11111111 11111111 10000010(补码)
11111111 11111111 11111111 10000001(反码)
10000000 00000000 00000000 01111110(原码) 表示-126
根据以上方法,推断出c=-126.
例题:
a=3,b=5交换两个变量,不使用第三个变量,b=3,a=5.
解法1: a=a+b;
b=a-b;
a=a-b;
但是这个方法有一个缺陷,会溢出
解法2:a=a^b;
b=a^b;
a=a^b;
总结:一个数被异或两次还是自己本身,不论异或的顺序!!!
第二个解法不会导致溢出
学的不是技术,更是梦想