首页 > 其他分享 >【落羽的落羽 C语言篇】操作符、二进制·之其一:初识编码方式及位操作符

【落羽的落羽 C语言篇】操作符、二进制·之其一:初识编码方式及位操作符

时间:2024-11-05 22:48:34浏览次数:5  
标签:11111111 二进制 落羽 补码 00000000 操作符 编码方式 原码

在这里插入图片描述

文章目录

  • 一、操作符
    • 1. 操作符的分类
    • 2. 操作符的属性
      • 2.1 优先级
      • 2.2 结合性
  • 二、二进制
    • 1. 原码、反码、补码
    • 2. 位操作符
      • 2.1 左移操作符 <<
      • 2.2 右移操作符 >>
      • 2.3 & | ^ ~

一、操作符

在C语言中,操作符是用于执行各种操作的符号,它们是构成语法、表达式的基本元素

1. 操作符的分类

我们可以把操作符分为以下几类:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
我们在以前已经知道了部分操作符并运用了,对于其他操作符,慢慢了解~

2. 操作符的属性

C语言的操作符有两个重要的属性:优先级、结合性

2.1 优先级

如果一个表达式包含多个运算符,不同运算符计算的优先级是不一样的。比如乘除运算符的优先级就比加减运算符的优先级高。

2.2 结合性

如果两个运算符优先级相同,优先级没办法确定先计算哪个,这时候就看结合性了,根据运算符是左结合,还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符 = 就是右结合。

优先级和结合性可以参考下表:链接在这里插入图片描述
在这里插入图片描述

二、二进制

我们首先应该知道的是:

  • 数据在内存中都是以二进制的形式存储的,二进制中满2进1,它的每一位都由0或1组成

  • 十进制数转换为二进制的方法是:用这个数除以2,得到的余数就是0或1;除2后的数再除2,得到的余数是0或1……如法炮制除完,将得到的0和1的序列自后向前从左到右排列,就是这个整数的二进制。举个栗子:将125转换为二进制
    在这里插入图片描述这样算完后,把右侧的余数自上而下从左到右排开,就是125的二进制了:1111101

  • 二进制转换为十进制:二进制从左至右的每一位依次乘以2的0次,2的1次,2的2次……加和,得到这个整数的十进制。举个例子,将1111101转换为十进制,即(1×1)+(0×2)+(1×4)+(1×8)+(1×16)+(1×32)+(1×64),等于125

  • 每类整型数据所占空间都不一样,比如short类型占据两个字节——16个bit的大小,而我们下面主要使用的 int 类型,占据4个字节——32个bit的大小。也就是说,int类型的数据的二进制原码、反码、补码,都是由32个0或1组成的,将十进制数翻译为二进制后,前面的空位都用0(符号位是0或1)补全。

1. 原码、反码、补码

整数的二进制有三种表示方法:原码、反码、补码。
有符号整数的三种表示方法里,都分为符号位数值位两部分。二进制序列中,最高位是符号位,剩下的都是数值位。
在符号位上,0表示正,1表示负

要注意的是:

  • 正整数(包括0)的原码、反码、补码完全相同
  • 负整数的原码、反码、补码都不相同

那么这三种表示方法具体是什么呢?

  • 原码:直接将数值按照正负数的形式转换为二进制,得到的序列
  • 反码:(对于负数来说)原码的符号位不变,剩下每一位取反,得到的序列
  • 补码:(对于负数来说)反码+1,得到的序列
    tip:(对于负数来说)补码的符号位不变,数值位每一位取反,再+1,就能得到原码

举例:
十进制数10
原码是00000000 00000000 00000000 00001010
反码是00000000 00000000 00000000 00001010
补码是00000000 00000000 00000000 00001010

十进制数-10
原码是10000000 00000000 00000000 00001010
反码是11111111 11111111 11111111 11110101
补码是11111111 11111111 11111111 11110110

对于所有整形数据来说:内存中存放的都是他们的补码
原因了解一下就可以,看不懂也冇关系啦:使用补码,可以将符号位和数值位统一处理,同时加法和减法也可以统一处理(CPU只有加法器)。此外,补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

2. 位操作符

位操作符是一类针对二进制的操作符,位操作符的操作数只能是整数

2.1 左移操作符 <<

<< 的作用,是让补码的每一位数左移几位,原本最左面的几位数丢弃,最右边空缺出的位置用0补满。
比如,来个int n = 10,那么n的补码就是00000000 00000000 00000000 00001010
如果执行语句int m = n<<2,就是n的补码的每一位向左移动2位,左边2位抛弃,右边2位补0,即00000000 00000000 00000000 00101000,转换为原码还是这个,即 m=40,n不变。

2.2 右移操作符 >>

右移操作符的移位方式分为两种:

  • 逻辑右移:右边的几位丢弃,左边空缺的几位用0填充
  • 算术右移:右边的几位丢弃,左边空缺的几位用原值的符号位数填充

在实际使用中,用哪一种移位方式其实是取决于编译器的,但常见的编译器都是默认执行算术右移的,下面我们也使用这一种方法。
比如int n = -10,那么n的补码就是11111111 11111111 11111111 11110110。如果执行语句int m = n>>2,就是n的补码每一位向右移动2位,右边2位丢弃,左边2位用1填充,即11111111 11111111 11111111 11111101,转换为原码是10000000 00000000 00000000 00000011,即m= -3,n不变。

WRANING:不要在<<或>>后加负数,这样是无定义的!

2.3 & | ^ ~

这几个位操作符分别是
&:按位与
| :按位或
^:按位异或
~:按位取反

让我们分别来说……

  • &:n & m,计算方式是,把两个数n和m的补码对齐,同一位上的两个数中只要存在0,计算结果的这一位就是0。两个数都是1,这一位就是1;

  • | :n | m,计算方式是,把两个数n和m的补码对齐,同一位上的两个数中只要存在1,计算结果的这一位就是1。两个数都是0,这一位就是0;

  • ^:n ^ m,计算方式是,把两个数n和m的补码对齐,同一位上的两个数相同,计算结果的这一位就是0。两个数不同,这一位就是1。 ^ 有几个公式:
    在这里插入图片描述

  • ~: ~n,计算方式是,把数n的补码的每一位都取反。

注意:这些计算都是对补码的计算,得到的也是结果的补码,换算成原码才是真正的结果!

在这里插入图片描述

说了这么多,这些操作符具体有啥用呢?敬请期待《二进制·之其二》~
本篇完,感谢阅读

标签:11111111,二进制,落羽,补码,00000000,操作符,编码方式,原码
From: https://blog.csdn.net/2402_86681376/article/details/143487780

相关文章

  • C语言学习之操作符
    (1)二进制、十六进制、八进制不同进制只是数值不同的表达形式,二进制转换十进制省略,从十进制转换到二进制(不断除二取余自下向上将余数从左到右写下来,就转换到二进制);从二进制转换八进制(从左向右每三位按二进制位换算一个八进制位,不够三个直接换算);从二进制转换到十六进制(跟八进制......
  • 操作符史上最全解析没有之一!!!!!!! (上)
    文章目录1.算术操作符2.移位操作符3.位操作符&按位与|按位或^按位异或例题例题:4.赋值操作符-=+=*=/=%=<<=<<=&=|=5.单目操作符!+--&sizeof~++*类型(强制类型转换)6.关系操作符<<=!=\>\>===7.逻辑操作符8.条件操作符9.逗号表达式1.算术操作......
  • 成为不可取代的程序员的编码方式
    背景在一家公司呆了两年了,作为工作十多年的程序员来说,真心感觉这两年时间是真的长,每天上班如上坟,度日如年。21年入坑,接手了一个老项目,进去后发现项目几乎天天报错,每天群里bug满天飞,每天改完一个bug,一会群里又开始叫,每天都是晚上下班才有时间输出业务代码。开始还特别不习......
  • 操作符详讲系列·1
    进制就不给大家详细的进行讲解了1,原码,反码,补码整数的2进制表⽰⽅法有三种,即原码、反码和补码1,整数分为有符号的整数和无符号的整数,无符号的整数只有0和正整数,有符号的整数又分为正整数和负整数,正整数的原码反码补码都是一样的,负整数的原码反码补码各不相同,需要进行计算。有......
  • 为什么在http协议中使用base64编码方式传输二进制文件
    相关:图解Base64实现原理并使用js实现一个简单的Base64编码器常用加密方法之Base64编解码及代码实现一直都知道在http协议中使用base64的方式传递二进制文件,虽然感觉不理解,但是也都从来没有探究过原因,今天突然看到这方面的资料,这才有了一些理解。PS:把带有图片的网页......
  • mongodb 查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操
    mongodb查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操作符,更新单个/多个文档,删除文档,批量插入,$type操作符,内嵌文档和数组查找修改1.条件查询SQLMQLa=1{a:1}a<>1{a:{$ne:1}}a>1{a:{$gt:1}}a>=1{a:{$gte:1}}a<1{a:{$lt......
  • C 语言 【操作符(下)】
        说到这操作符下篇,各位看官老爷可得认真听听喽。主要就是说说这整型提升和算术转换,对于初学者来说可能学到的内容太过浅显,今天就让我呀来带您好好唠唠。    先接着上篇的内容给大家聊聊吧。4、单目操作符( !-  + & sizeof ~ -- ++ *) ......
  • C语言 【操作符(上)】
        最开始提到C语言操作符,我还是有一些不屑的,这玩意有啥学的呀?今天静下心来阅读学习了一下操作符部分的知识,这部分还真得认真学习学习!下面我将操作符中一些比较关键的点进行罗列和详细说明。一来帮助我加深理解,二来希望能帮助到有缘点击进来的读者。1、算术操作符:+ ......
  • 禁止拷贝构造函数和赋值操作符
     GlobalSettings(constGlobalSettings&)=delete;GlobalSettings&operator=(constGlobalSettings&)=delete;这两行代码是为了禁止拷贝构造函数和赋值操作符,也就是说,GlobalSettings 类的对象无法通过拷贝或赋值来创建或修改。这是为了防止类的实例被复制,通常用于实现单......
  • union all SQL 操作符
    在Hive中,`UNIONALL`是一个SQL操作符,用于将两个或多个查询的结果合并为一个结果集。与`UNION`不同,`UNIONALL`不会自动去重,因此它会返回所有查询结果,包括重复的记录。以下是`UNIONALL`在Hive中的一些主要作用和特点: 主要作用1.合并结果集:  可以将多个S......