1.进制
十进制(0~9)
二进制(0~1) 余0进1
十进制转二进制:十进制除以二进制的余数(从下往上排列)
八进制(0~7) 第一位是0
十六进制(0~F) 前两位是0X #2. 整数的二进制表示方法 构成:符号位+数值位(0表示正,1表示负)
3.原码反码补码
整形占用4个字节,即32个比特位 对于整数来说,内存中存放的是补码 正整数的原反补码都相同
反码:原码的符号位不变,其他位按位取反
补码:反码+1
4.移位操作符
移位操作符的操作数只能是整数
<<
左移操作符:左边抛弃,右边补0
>>
右移操作符
1.逻辑右移:左边用0填充,右边丢弃2.左边用原该值的符号位填充,右边丢弃
5.位操作符
注:程序以补码的形式存储在内存中,十进制%2得到二进制的最低位;/2可去掉最低位
,0为假,非零为真
&
(按位与) 对应二进制位,有0则为0,两个同时为1才为1
a&1可以得到最低位是几
|
(按位或),对应二进制位有1则为1,两个同时为0才为0^
(按位异或)对应二进制位上,相同为0,相异为1;异或支持交换律~
按位取反操作符:对应二进制位上,全部取反,包括符号位,0变1,1变0,得到补码
异或操作具有局限性:1.只能作用于整数交换 2.代码的可读性差 代码的执行效率低于使用第三个变量的方法
a^a=00^a=a
正整数的原码,反码和补码都相同负整数以补码的方式存在内存中
int main()
{
int num = -3;
int num2 = 5;
//num1:10000000000000000000000000000011[原码】(需要换成补码)
//反码:11111111111111111111111111111100
//补码:11111111111111111111111111111101
//num2:00000000000000000000000000000101
int a = num & num2;
//a=00000000000000000000000000000101=5
int b = num | num2;
//b= 11111111111111111111111111111101
//反码:11111111111111111111111111111100
//原码:10000000000000000000000000000011=-3
int c = num ^ num2;
//c= 11111111111111111111111111111000
//反码:11111111111111111111111111110111
//原码:10000000000000000000000000001000=-8
printf("%d\n%d\n%d\n", a, b, c);
return 0;
}
求一个整数存储在内存中的二进制中的1的个数
6.逗号表达式
逗号表达式的优先级是最低的,从左向右依次执行,整个表达式的结果是最后一个表达式的结果
int main()
{
int a = 0;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
//a>b为假,继续向后执行;a=b+10即a=12;a=12;b=13;即c=13
printf("%d\n", c);
return 0;
}
7.下标访问,函数调用
[]
下标引用操作符
int arr[10]
printf("%d",arr[9]);//打印下标是9的元素,操作数是arr和 9
()
函数调用操作符:最少一个操作数
int ret=Add(2,3);
//()的操作数是Add,2,3
sizeof
不是函数,是操作符
8.优先级
先算优先级高的
由高到低排列:
9.表达式求值
表达式求值之前要进行类型转换,当表达式的值转换到适当的类型才开始计算
整型提升
C语⾔中整型算术运算总是⾄少以缺省(int )整型类型的精度来进⾏的。
有符号整数:一位(符号位)+31位数值位【符号位是1表示负数】【符号位是0表示正数】无符号整数,没有符号位,32位都是数值位
如何进⾏整体提升呢?
- 有符号整数提升是按照变量的数据类型的符号位来提升的(vs中默认char类型是有符号位的)【前面补符号位】
- ⽆符号整数提升,⾼位补0