C语言之移位操作符与进制转换详解(保姆级教程)

C语言之移位操作符详解

文章目录

  • C语言之移位操作符详解
    • 1 简介
    • 2 二进制
      • 2.1 二进制转十进制
      • 2.2 十进制转二进制
      • 2.3 二进制转八进制
      • 2.4 二进制转十六进制
    • 3 原码 反码 补码
    • 4 移位操作符
      • 4.1 左移操作符
      • 4.2 右移操作符

1 简介

  移位操作符分为左移<< ,右移>> ,在介绍移位操作符之前,我先来介绍一下各进制转换的转换

2 二进制

二进制,八进制,十进制,十六进制是数值的不同表现形式
例如:

15的不同表示形式

1 15的二进制:1111
2 15的八进制:17
3 15的十六进制:F
在进制转换中我们把9之后的数,用a,b,c,d,e,f来表示(大小写都可以)
1 2 3 4 5 6 7 8 9 a b c d e f
十进制:
• 十进制是满十进一
• 十进制的每一位是0~9
二进制:
• 二进制就是满二进一
• 二进制只能由0 1组成

2.1 二进制转十进制

十进制:
C语言之移位操作符与进制转换详解(保姆级教程)_第1张图片

二进制也是相同的道理
C语言之移位操作符与进制转换详解(保姆级教程)_第2张图片

2.2 十进制转二进制

我们来看一个例子
C语言之移位操作符与进制转换详解(保姆级教程)_第3张图片

2.3 二进制转八进制

八进制由0~7的数组成,每3位二进制转换成1位八进制,不够三位的左边补零
例如01101011,就可以化成001,101与011,然后计算二进制的权重值,所以01101011转换成八进制就是0153,在前面加上0表示八进制
C语言之移位操作符与进制转换详解(保姆级教程)_第4张图片

2.4 二进制转十六进制

十六进制由0~9,A ~ F 的数组成,每4位二进制转换成1位十六进制,不够四位左边补零
例如01101011,就可以化成0110与1011,然后计算权重值,所以01101011转换成十六进制就是0x6b,早前面加上0x表示十六进制
C语言之移位操作符与进制转换详解(保姆级教程)_第5张图片

3 原码 反码 补码

• 整数的二进制表示有三种原码 反码 补码
• 有符号整数的三种表⽰⽅法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号位,剩余的都是数值位
• 符号位0表示正数 1表示负数

正整数的原码 反码 补码都相同
负整数的原码 反码 补码表示方式不同
原码:将数值转换成二进制就得到原码
反码:最高位符号位不变,数值位按位取反就得到反码
补码:反码+1就得到补码
补码得到原码也可以先取反再+1
C语言之移位操作符与进制转换详解(保姆级教程)_第6张图片

4 移位操作符

整型在内存中其实存放是补码,所以我们移动的是补码

<< 左移操作符和 >>右移操作符

TIPS:移位操作符只能对正整数使用

4.1 左移操作符

移动规则:左边抛弃,右边补0

#include 
int main()
{
	int num = 10;
	int n = num << 1;
	printf("num = %d\n", num);
	printf("n = %d\n", n);
	return 0;
}

运行结果:
num = 10
n = 20
num左移之后值不会改变

正整数的原码 反码 补码相同
10的二进制00000000 00000000 00000000 00001010
左边丢弃一个0,右边补一个0
所以左移之后
00000000 00000000 00000000 00010100
转化为十进制为20
由于整型是4个字节,所以整数只有32个比特位,右边补了一个0,那么左边多了一个比特位,这个比特位就会丢失

4.2 右移操作符

移动规则:
右移分为两种:

  1. 逻辑右移:左边补零,右边抛弃
  2. 算术右移:左边补符号位,右边抛弃
    右移是逻辑右移还是算术右移这取决于编译器
    在大部分编译器中,使用的是算术右移
    在VS2022中使用的是算术右移
#include 
int main()
{
	int num = 10;
	int n = num >> 1;
	printf("num = %d\n", num);
	printf("n = %d\n", n);
	return 0;
}

运行结果:
num = 10
n = 5

10的补码:00000000 00000000 00000000 00001010
左边补符号位,右边抛弃
右移之后:00000000 00000000 00000000 00000101
转换为十进制为5

无论是左移还是右移,都只应用与正整数

你可能感兴趣的:(初识C语言,c语言,开发语言,学习,笔记)