算术操作符
+、-、*、/
除法:
- 整数除法(除号的两端都是整数)。
- 浮点数除法(除号的两端只要有一个小数就执行小数除法)。
取模操作符(%):
操作符两边必须是整数。
移位操作符
移位操作符有两种:>>(右移)和<<(左移)。 它的操作数只能是整数。
对于整数的二进制有三种表示形式:1、原码 2、反码 3、补码
- 正整数:原码、反码、补码都是一样的。
- 负整数:原码、反码、补码是需要计算的。
- 整数在内存中存储的是补码。
- 直接写出一个整数的二进制序列的是原码。
但是不管是正整数还是负整数都可以写出二进制原码:
-
根据正负数直接写出的二进制序列就是原码。
-
对于负数来说:a、直接写出的是原码。 b、符号位不变,其余位按位取反
得到反码。 c、反码加一得到补码。
int main() { int a = 5; int b = -5; return 0; }首先看看内存:

分析:
右移
移动的是补码。
右移有算术右移和逻辑右移两种:
- 算术右移:右边丢弃,左边补原来的符号位。
- 逻辑右移:右边丢弃,左边补0。
c语言没有明确规定到底是算术右移还是逻辑右移,一般来说编译器用的是算术右移。
int main()
{
int a = 5;
int b = a >> 1;
int c = -5;
int d = c >> 1;
printf("b = %d\n", b);
printf("d = %d\n", d);
return 0;
}

分析:

左移
左边抛弃,右边补0。
int main()
{
int a = -5;
int b = a << 1;
printf("%d\n", b);
return 0;
}

分析:

位操作数
位操作符:
&:按位与 |:按位或 ^:按位异或
位操作符的操作数必须是整数。
按位与(&)
对应的二进制位有0则为0,两个同时为1则为1。
int main()
{
int a = 3;
int b = -5;
int c = a & b;
printf("%d\n", c); // 3
return 0;
}

按位或(|)
对应的二进制位有1则为1,两个同时为0才是0。
int main()
{
int a = 3;
int b = -5;
int c = a & b;
printf("%d\n", c); // -5
return 0;
}



按位异或(^)
对应的二进制位相同为0,相异为1。
int main()
{
int a = 3;
int b = -5;
int c = a & b;
printf("%d\n", c); // -8
return 0;
}



隐式类型转换
整形提升
概念:表达式中的字符和短整型操作数在使用之前会被转换成int类型。
整形提升:对char类型和短整型(short int)来讲。
整形提升是按照变量的数据类型的符号位来提升的。
对于无符号的的整型提升,高位直接补0。
int main()
{
char c1 = 125;
char c2 = 36;
char c3 = c1 + c2;
printf("%d\n", c3);
return 0;
}


算术转换
算术转换:是针对类型大小大于等于4字节的类型。
如果某个操作符的操作数属于不同的类型,那么除非其中一个操作数得转换为另一个操作数的类型,否则操作就无法进行。
如果表达式中有int和float类型的数据,会把int转化为float类型。会向上转换。