C语言操作符详解一:(左移右移二进制,整数在内存中的存储)

算术操作符:

算术操作符有:加法+   减法-  乘法*  除法/   取余%

算术操作符该注意的点:

1.除了%操作符之外,其他的操作符都可以作用于整数和浮点数。

2.对于/操作符来说,两个数都是整数的话,结果只能是整数,如果其中一个是浮点数的话,那结果也是浮点数。

3.%操作符的两个数必须是整数,返回的是整除之后的余数。

移位操作符:

<< : 左移操作符

>> :右移操作符

注意:移位操作符只能操作整数!

整数在内存中二进制的补充:

在详细了解操作符之前我们要知道移位操作符移动的是二进制的位。

对于一个整数四个字节就是32个bit位,二进制也是32个bit位(类如:1  在内存中是00000000 00000000 00000000 00000001)。

在内存中存储的二进制位,思考负数是怎么存储的?所以32个bit位最左边的叫做符号位

符号位为1就是负数,为0就是正数。(补充:无符号整数,没有符号位,都是有效位)

原码:就是整数的原本二进制位的样子。

反码:原码的符号位不变,其他位取反

补码:反码的二进制加1

整数在内存中的存储都是补码的形式,计算也是用的补码。(提示:负数在内存中是补码的形式,如果想知道是什么负数需要计算!补码变原码也是取反加1

对于正整数来说,三码相同,负数需要计算

1.左移操作符

移位操作符移动的都是整数在内存中的存储的补码

左移操作符的规则:左边抛弃,右边补0

类如:

C语言操作符详解一:(左移右移二进制,整数在内存中的存储)_第1张图片

但是实际上num的值没发生改变,因为没赋值。

2.右移操作符

右移操作符分两种:

1.逻辑移位:左边用0填充,最右边的一位抛弃

2.算术移位:左边用原值的符号位填充,最右边的一位抛弃

关于这两种移位方式,取决于用的是哪种编译器。

因为我们常用是VS,而VS用的是算术移位。

注意:对于这两种移位操作符,不要移动负数位,这个C语言标准没定义的,类如:
 

int num = 10;
num >> -1;

位操作符:

位操作符也是操作的是二进制位。

位操作符有:

1.&:按位与

按位与是对应的二进制位,类如:

int main()
{
	int a = 10;
	int b = 1;
	int c = a & b;
	printf("%d", c);
}

C语言操作符详解一:(左移右移二进制,整数在内存中的存储)_第2张图片

结果怎么是0的,我们来看看:

C语言操作符详解一:(左移右移二进制,整数在内存中的存储)_第3张图片

补充:按位与1,就可以知道我们数字在内存中二进制位中的最后一位是1还是0了。

2.| : 按位或:

和按位与的相同道理,但是按位或的规则是:

1 | 1 = 1 , 1 | 0 = 1 , 0 | 0 = 0。

3.^ : 按位异或:

相同为0,相异为1.

这个按位异或有一些特殊的:

类如:a ^ a = 0     a ^ 0 = a。

一些特殊题:

不创建临时变量或者第三个变量,交换两个变量的值:

这道题就需要我们的按位异或:

int main()
{
	int a = 10;
	int b = 8;
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("a = %d\n", a);
	printf("b = %d\n", b);
}

C语言操作符详解一:(左移右移二进制,整数在内存中的存储)_第4张图片

怎么会这样的?

按位异或支持交换律的,所以第一个a = a ^ b , 第二个的时候我们把 a 替换成 a ^ b 带进去算:

b = a ^ b  :  a ^ b ^ b ,因为 b ^ b  = 0 ,所以 a ^ 0 = a,所以 b = a 。第三个我们也把 a = a ^ b

b = a  带进去算,所以 a = a ^ b :   a ^ b ^ a,所以一样的,这两个数值就交换了。

留下一道题大家可以自己试一试:求一个整数在内存中二进制位中有多少个1

你可能感兴趣的:(c语言复健学习,c语言,开发语言)