操作符

164 阅读3分钟

算术操作符

+-*/

除法:

  1. 整数除法(除号的两端都是整数)。
  2. 浮点数除法(除号的两端只要有一个小数就执行小数除法)。

取模操作符(%):

​ 操作符两边必须是整数。

移位操作符

移位操作符有两种:>>(右移)和<<(左移)。 它的操作数只能是整数。

对于整数的二进制有三种表示形式:1、原码 2、反码 3、补码

  1. 正整数:原码、反码、补码都是一样的。
  2. 负整数:原码、反码、补码是需要计算的。
  3. 整数在内存中存储的是补码。
  4. 直接写出一个整数的二进制序列的是原码。

但是不管是正整数还是负整数都可以写出二进制原码:

  1. 根据正负数直接写出的二进制序列就是原码。

  2. 对于负数来说:a、直接写出的是原码。 b、符号位不变,其余位按位取反

    得到反码。 c、反码加一得到补码。

    int main()
    {
        int a = 5;
        int b = -5;
        return 0;
    }
    

    首先看看内存:

    image-20240402210312831

​ 分析:image-20240402211050421

右移

移动的是补码。

右移有算术右移和逻辑右移两种:

  1. 算术右移:右边丢弃,左边补原来的符号位。
  2. 逻辑右移:右边丢弃,左边补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;
}

image-20240402212340288

分析:

image-20240402214043577

左移

左边抛弃,右边补0。

int main()
{
	int a = -5;
	int b = a << 1;
	printf("%d\n", b);
	return 0;
}

image-20240402220223933

分析:

image-20240402220410290

位操作数

位操作符:

&:按位与 |:按位或 ^:按位异或

位操作符的操作数必须是整数。

按位与(&)

对应的二进制位有0则为0,两个同时为1则为1。

int main()
{
	int a = 3;   
	int b = -5;  
	int c = a & b; 
	printf("%d\n", c);  // 3
	return 0;
}

image-20240402222508452

按位或(|)

对应的二进制位有1则为1,两个同时为0才是0。

int main()
{
	int a = 3;   
	int b = -5;  
	int c = a & b; 
	printf("%d\n", c);  // -5
	return 0;
}

image-20240403213919236

image-20240403213934376

image-20240403214019655

按位异或(^)

对应的二进制位相同为0,相异为1。

int main()
{
	int a = 3;   
	int b = -5;  
	int c = a & b; 
	printf("%d\n", c);  // -8
	return 0;
}

image-20240403215501451

image-20240403215520500

image-20240403215552238

隐式类型转换

整形提升

概念:表达式中的字符和短整型操作数在使用之前会被转换成int类型。

整形提升:对char类型和短整型(short int)来讲。

整形提升是按照变量的数据类型的符号位来提升的。

对于无符号的的整型提升,高位直接补0。

int  main()
{
	char c1 = 125;
	char c2 = 36;
	char c3 = c1 + c2;
	printf("%d\n", c3);
	return 0;
}

image-20240405093549222

image-20240405093647746

算术转换

算术转换:是针对类型大小大于等于4字节的类型。

如果某个操作符的操作数属于不同的类型,那么除非其中一个操作数得转换为另一个操作数的类型,否则操作就无法进行。

如果表达式中有intfloat类型的数据,会把int转化为float类型。会向上转换。