C语言操作符(1)

本文详细介绍了C语言中的位操作,包括取模、除法、移位操作符的使用规则,并通过示例解释了如何使用位操作进行无溢出的数值交换。此外,还探讨了正数在原码、反码、补码中的表现,以及二进制转换和位计数的相关知识。同时,提到了异或操作在数值交换中的应用。
摘要由CSDN通过智能技术生成

易错点

1)对于取模%操作符来说,两边必须是整型。

2)对于 / 操作符如果两个操作数都为整数,执行整数除法;而只要有一个浮点数,执行的就是浮点数除法。

一、移位操作符

<< 箭头指向左手:左移操作符

>>箭头指向右手:右移操作符

注:移动的是二进制位,位数看数据类型。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

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

在计算机中数字都是用补码存放,原因很简单,因为补码与数字是一 一对应的,
比如用原码时,正0、0、负0都表示0。
 原码不是一 一对应。

所以a的二进制原码为:1001(这里就不补全为32位了)

在移位运算时是用补码的,即1111,

算术右移一位为:1111,

再变为原码1001即-1传给b。

所以b还是-1。

注:左移操作符,左边丢弃,右边补0.

只能作用于整数。 

 

 例:不用临时变量交换两级数

1.2.正常写法:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int a = 10;
	int b = 20;
	int tmp = 0;
	printf("before:a = %d, b = %d\n", a, b);
	tmp = a;
	a = b;
	b = tmp;
	printf("after:a = %d, b = %d\n", a, b);

	return 0;
}

加减法:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int a = 10;
	int b = 20;
	printf("before:a = %d, b = %d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("after:a = %d, b = %d\n", a, b);

	return 0;
}

缺陷:a和b都为较大的值时,相加可能溢出,总和不准。

2.

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int a = 10;
	int b = 20;
	printf("before:a = %d, b = %d\n", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("after:a = %d, b = %d\n", a, b);

	return 0;
}

原理参考:https://blog.csdn.net/borefo/article/details/4622288 

任何一位二进制数同 1 异或相反(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)
任何一位二进制数同 0 异或不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)

a = 3, b = 4

     a = 011

     b = 100

a ^ b = 111,和a按位比是:相反,不变,不变

      b = 100 

a^b^b= 011,和a^b按位比是:相反,不变,不变

即a与a^b:相反,不变,不变,

a^b与a^b^b:相反,不变,不变,

a与a^b是相反的,a^b又与a^b^b相反,那么a^b = a相反,推出a^b^b = a相反的相反,那么就是a 与 a^b^b是相同的。

所以有两个异或直接抵销。

 疑点1.正数为什么原、反、补相同?

2.十进制转二进制原理是什么?

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int num = 0;
	int count = 0;
	int i = 0;
	scanf("%d", &num);
	//统计num的二进制补码中1的个数
	for(i=0; i<32; i++)
	{
		if(1 == ((num>>i)&1))
			count++;
	}
	printf("%d\n", count);

	return 0;
}

 注:()的优先级问题。

 

 与的位操作符为 &

二、赋值操作符:重新赋值

三、

 四、

 注:a + b 有两个操作数,所以“+”是双目操作符。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int a = 0;
	if(a)
	{
		printf("666\n");
	}
	if(!a)
	{
		printf("666\n");
	}

	return 0;
}

!a:a为假时。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int a = 10;
	int* p = &a;//取地址操作符
	*p = 20;//解引用操作符
	printf("a = %d\n", a);

	return 0;
}

 

sizeof后面是数据类型不能省略括号,后面是变量名时可以省略。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值