c语言 操作符进制加整形提升进制


C语言看进制

操作符

1.左移操作符 <<

   左边丢弃,右边补零

例:

5 的二进制 00000000 00000000 00000000 00000101

5<<1       00000000 00000000 00000000 00001010      ==> 10

5左移一位,就会变成10.

2.右移操作符 >>

右移操作符有分两种:算数右移和逻辑右移.

算数右移

  右边丢弃,左边补原符号位

例:

5 的二进制  00000000 00000000 00000000 00000101

5>>1       00000000 00000000 00000000 00000010  ==> 2

最左边的第32位补符号位 因为5是正数,所以最左边补00代表整数。
反之,出现-5的时候,最左边将会补11代表负数。

逻辑右移

  右移丢弃,左边补0

5 的二进制  00000000 00000000 00000000 00000101

5>>1       00000000 00000000 00000000 00000010  ==> 2

不论是+5还是-5,在逻辑右移中,在第32位都会补0

3.按位与 &

一假为假(其中的操作数必须为整数)

例:

a=3;    00000000 00000000 00000000 00000011

b=5;    00000000 00000000 00000000 00000101

c=a&b;  00000000 00000000 00000000 00000001

1为真,0为假,1&0=0,1&1=1,0&0=0;

所以c=1;

4.按位或 |

一真为真 (操作数必须为整数)

例:

a=3;    00000000 00000000 00000000 00000011

b=5;    00000000 00000000 00000000 00000101

c=a|b;  00000000 00000000 00000000 00000111

1为真,0为假,1|0=1,1|1=1,0|0=0;
所以c=7;

5.按位异或 ^

相同为0,想异为1 (操作数和必须为整数)

例:

a=3;    00000000 00000000 00000000 00000011

b=5;    00000000 00000000 00000000 00000101

c=a^b;  00000000 00000000 00000000 00000110

1为真,0为假,1^0=1,1^1=0,0^0=0;
所以c=6;

6.逻辑与 &&

一假为假,找到一个假的,后面的没有必要进行计算。

int i=0,a=0,b=2,c=3,d=4;

i=a++&&++b&&d++;

printf("%d %d %d %d",a,b,c,d);

打印出来的 a=1,b=2,b=3,d=4

解释:当进行a++的时候,先使用,后++,现使用会出现0
第一处的a++被解释为0,0为假,所以后面的式子都没有必要进行计算了。

7.逻辑或 ||

一真为真,找到一个真的,后面的没有必要进行计算。

int i=0,a=0,b=2,c=3,d=4;

i=a++&&++b&&d++;

printf("%d %d %d %d",a,b,c,d);

打印出来 a=1,b=3,c=3,d=4

解释 :第一个式子a++先使用后计算,a++在式子中为0,0表示假,向后继续计算,++b先计算后使用,++b在式子中为3,3是非0的数字,所以3表示真,后面的没有必要进行计算。

整形提升

int 占4个字节。
char 占一个字节。

#include<stdioi.h>

int main()
{
	char a=3;
	char b=127;
	char c=a+b;
	printf("%d\n",c);
	return 0;
}

  大家觉得c会等于多少呢?

c=127+3=130?

不不不,c=-126;

解释: char 类型的数据取值范围 -128~127。

int a=3;     00000000 00000000 00000000 00000011

char a=3;                               00000011

int b=127;   c

char b=127;                             01111111

开始提升:按照变量的符号位将进行提升

a   00000000 00000000 00000000 00000011
+
b   00000000 00000000 00000000 00000011
=
c   00000000 00000000 00000000 10000010

因为c是char类型,所以发生截断

C  10000010

对c开始整形提升:按照变量的符号位将进行提升

11111111 11111111 11111111 10000010(补码)

11111111 11111111 11111111 10000001(反码)

10000000 00000000 00000000 01111110(原码)  表示-126

根据以上方法,推断出c=-126.

例题:
   a=3,b=5交换两个变量,不使用第三个变量,b=3,a=5.

解法1: a=a+b;
         b=a-b;
         a=a-b;

但是这个方法有一个缺陷,会溢出

解法2:a=a^b;
         b=a^b;
         a=a^b;

总结:一个数被异或两次还是自己本身,不论异或的顺序!!!

第二个解法不会导致溢出

学的不是技术,更是梦想

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君生我老

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值