脆皮之(进制转换讲解)‘C语言操作符详解’ (包含结构体)

                 大家好吖,我是脆皮炸鸡

这一节是补充之前没有涉及到的操作符,其余操作符可以见之前的一篇笔记脆皮猛冲C语言之“数据类型和变量”and“分支与循环”

如果这一章节对大家有帮助的话,留个小心心鼓励一下我叭,我比较喜欢追动漫,动漫结尾经常听的一句就是“点赞加关注,追番不迷路”,哈哈哈哈,大家懂我的吧!!

在这里插入图片描述

(一). 二进制和其他进制转换

同样一个数字,可以写成二 / 八 /十 /十六进制

1.1 先讲解什么是二进制,八进制,十进制,十六进制

(从大家最熟悉的十进制入手)
(1)十进制:含有数字0到9,满10进1。(例如:9之后是10)
(2)二进制:只含有数字0和1,满2进1。(例如:满二进一,2用二进制表示为10,3就表示为11,4表示为100)
(3)八进制:含有数字0到7,满8进1。(例如:满八进一,8用八进制表示为10,9表示为11)
(4)十六进制:含有数字0到9,以及字母a-f,(a是10,b是11…f是15)满16进1。(例如:17用十六进制表示为11)

  • 十进制的123为什么是一百二十三呢?十进制的每一位都是有权重的,(从右到左)个位,十位,百位的权重依次是10的0次方, 10的1次方 , 10的二次方(图片表示)
  • 其他进制与十进制相似,每一位都是有权重的,举例二进制,个位,十位,百位的权重依次是2的0次方, 2的1次方 , 2的二次方
    在这里插入图片描述

1.2 十进制转二进制

以十进制的n转换为二进制为例
将n/ 2,余数留下,商继续 / 2,直到商为0 。最后将所得的余数倒着写出,就是125的二进制了(任何数除以2,它的余数肯定是0或者1)
在这里插入图片描述

  • 在此大家可以尝试写一个代码,将十进制数字转化二进制
void er(int x)
{
   
	if (x / 2 != 0) {
            //写的时候先想好递归终止条件(这里是商=0时递归结束)
		er(x / 2);
		printf("%d", x % 2);
	}
	else if (x / 2 == 0) {
            
		printf("%d", x % 2);
	}
}
int main()
{
   
	int n = 0;
	scanf("%d", &n);
	er(n);
}
  • 如果十进制的这个数字比较小,可以直接凑一下(如图所示)
    在这里插入图片描述

1.3 二进制转八进制

先看一下八进制的数字用二进制都是如何表示的

在这里插入图片描述

  • (1)由此可见,八进制的任何一个数字,最多需要3个二进制位,不够三位,在前面补0。
  • (2)0开头的数字,才表示八进制(以123举例,0123是3*1+2*8+1*64=83)
    在这里插入图片描述
  • (3)这一步学习如何将二进制转换为八进制:从右往左,每三位看作一个;如果到最左边不够三位,在前面补0。
    在这里插入图片描述

1.4 二进制转十六进制

先看一下十六进制的数字用二进制都是如何表示的

在这里插入图片描述

  • (1)由此可见,十六进制的任何一个数字,最多需要4个二进制位,不够四位,在前面补0。
  • (2)0x开头的数字,表示十六进制。
  • (3)这一步学习如何将二进制转换为十六进制:从右往左,每四位看作一个;如果到最左边不够四位,在前面补0。
    在这里插入图片描述

(二).移位操作符

移位操作符:移动的是存储在内存中的二进制位(补码)

所以在此之前,我们先讲解一下什么是补码

2.1 原码,反码和补码

在了解二进制的操作符之前,我们需要先明白什么是原码,反码和补码。

当我们要把一个数转换成二进制表示的时候,整数的二进制有三种表示形式(此处先不考虑浮点数):原码,反码和补码。

有符号整数(有正有负)的原码,反码和补码,都是由符号位(1位)和数值位(31位)组成。二进制序列中,最高位的那一位是符号位(正是0,负是1),其余的31位是数值位(int默认的是signed int,int的长度是4个字节,即32个比特位)

对于无符号整型(unsigned int),它根本就没有符号,也就没有符号位,所有的位都是数值位

  • 原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。
  • 反码:原码的符号位不变,其余位按位取反(~)
  • 补码:反码+1在这里插入图片描述

正整数的原码,反码,补码相同

int b = 10;
//原码00000000000000000000000000001010
//反码00000000000000000000000000001010
//补码00000000000000000000000000001010

负整数的原码,反码,补码各不相同

int b = -10;
//原码10000000000000000000000000001010
//反码11111111111111111111111111110101
//补码11111111111111111111111111110110

对于整数来说,储存在内存中的其实是补码(看到一个数字,先写原码,再取反加一)

  • 两个数据运算时,是用它们的补码在计算。用补码运算,记住:补码补码补码
    好处一:使用补码,可以将符号位和数值域统一处理
    好处二:加法和减法也可以统一处理(CPU只有加法器)
    好处三:补码与原码相互转换,其运算过程是相同的(取反加一),不需要额外的硬件电路

2.2 移位操作符

1.移位操作符移动的是存储在内存中的二进制位(补码),且操作数只能是整数
2.对于移位运算符,不要移动负数位(比如向左移动-3位)

  1. 左移操作符:<<
    向左移动一位,最左边的丢弃,最右边补0。
    在这里插入图片描述
int main()
{
   
	int a = -9;  //a是负整数,补码计算
	               //原码:10000000000000000000000000001001
	               //反码:11111111111111111111111111110110
                   //补码:11111111111111111111111111110111
	int b = a << 1;
	//      左移一位的补码:11111111111111111111111111101110   
	//               取反:10000000000000000000000000010001
	//(这一步得到原码)加一:10000000000000000000000000010010      
	                                      //1*2(1)+1*2(4)=2+16=18
	printf("%d\n", a); //此处,a是不变的,b是向左移一的a
	               -9    //如果想让a向左移一,可以写成int a = a<<;
	printf("%d\n", b); //b是向左移一的a
	               -18
}
int main()
{
   
	int a = 9;   //a是正整数,原码即补码
	//补码:00000000000000000000000000001001    //9
	//左一:00000000000000000000000000010010   //18
	//左移一之后是补码,正整数补码即原码
	int b = a << 1;
	printf("%d\n", a);
	printf("%d\n", b);
}

从中可以发现:左移一位有乘二的效果

2 . 右移操作符: >>
右移有两种:算术右移

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值