操作符(原码反码补码)

目录

前言:

原反补码:

位操作符:

 ^

>>

<<

总结: 

逻辑操作符

&&

|| 

其他操作符: 

sizeof

++ 

-- 

()

?:(三目操作符)

,(逗号运算符)

+=

%

整形提升

练习巩固: 


 

前言:

  我们学习编程语言就必须会里面的所有操作符,在了解操作符之前需要有一些基础知识,我们必须要了解这些知识才能更好的去看其他内容。

  那么接下来我就一一详细介绍,有特别需求者可以直接跳转目录。

原反补码:

  我们知道内存里面存放的是二进制数据,内存记录的是二进制,B是电脑存储的基本单位(字节),1字节有8个比特位,就是8个二进制序列。如下:

1B  =8bit=8比特

1KB=1024B=1024字节

1MB=1024KB=1,048,576字节

1GB=1024MB=1,073,741,824字节

1TB=1024GB=1,099,511,627,776字节

1PB=1024TB=1,125,899,906,842,624字节

1EB=1024PB=1,152,921,504,606,846,976字节

1ZB=1024EB=1,180,591,620,717,411,303,424字节 

1YB=1024ZB=1,208,925,819,614,629,174,706,176字节 

  如int类型,有4个字节,32个比特位。但是负数该如何表示呢?

       于是就把最高位代表符号位,1代表负数,0代表正数。我们一般定义的int a = 1,C语言已经默认是有符号的整形。

       进入正题,原码、反码和补码到底是什么呢?在内存中存储的数据其实是以补码的方式存在的,因为计算机其实只会加减和位运算,为了解决负数的计算不会出错,就发明了补码(具体原因可以暂时忽略)。

  1. 原码:将一个数字以二进制记录,最高位是符号位,负数的最高位是1,正数的最高位是0。
  2. 反码:符号位不变,其他位按位取反。
  3. 补码:将反码加1。

       我们来看看-1在内存中是如何占据的:

       地址为方便表示将一个16进制位代表8个bit位(不影响阅读,详情请看进制的转换-CSDN博客)。 此时你就会考虑到,既然int有4个字节,32个比特位,那么如果把这32位全部填充成1是不是会有上限?明确的告诉你,确实如此。

       我们可以看到,当32位全部填充成1时,最大10进制无符号数整形(unsigned int)就保存的是4294967295。但是前面说最高位是符号位,我们一般定义的默认就是有符号的整形(signed int),那么如果最高位是0(就是正数),最高位就是少了一个1。

       所以看出整形保存的正数最大存储的数据是2147483647。关于原反补码的转换也有快捷方式,我们也可以将补码直接符号位不变,其他位按位取反以后加1直接得到原码,如下图:

(声明:补码的出现是为了负数方便计算,所以正数的原、反、补码相同)

       有了以上基础,我们就可以无障碍阅读一下内容了。 

位操作符:

  这个操作符有两种意思。

  1. 按位与:位操作符,与数学中的与相似,两真则真,一假则假(真可以理解为1,假可以理解为0)。遇到负数时先转化为补码,之后按位与。如图(负数与正数按位与)
  2. 取地址:因为每个变量在计算机中都有存储的空间,所以就有对应的地址编号(暂不用了解,涉及指针,详情请看指针(基础篇)-CSDN博客,也可以跳过,不影响阅读),此时就不再是位操作符。

  按位或:位操作符,一真则真,遇到负数时转化为补码,之后按位或。

 ^

  按位异或:位操作符,相同出零,相异出一。

 按位取反 :对一个数进行操作,是针对二进制位进行操作。

//这里可以忽略Printf的具体实现
void Printf(int a)
{int count = 32;while (count--){printf("%d", (a >> count) & 1);}
}int main()
{int a = 5;//对应的二进制位//00000000000000000000000000000101//~就是每一位取反//11111111111111111111111111111010//为方便讲述//此时我们使用函数打印其二进制序列//注:这不是printf函数Printf(~a);return 0;
}

>>

  右移操作符:将二进制位整体向右移,分为两种情况。

  • 算术右移:右边丢弃,左边补原符号位。通常是采用算数右移,右移时,先将数字转化为补码,之后右移,符号位不变,此时为转化后的补码,再将它转化为原码,得到二进制数,之后看符号位,将其转化为十进制即可。如图

       每当我们右移一位时,和十进制规律一样,该数会2倍缩小。

  • 逻辑右移:右边丢弃,左边补零。因为一般不会使用逻辑右移,所以我们不再举例。

       到底是算术右移还是逻辑右移,是取决于编译器,大部分编译器上是算术右移。

<<

       对应的,该操作符是左移操作符,但是它没有像右移操作符一样分为逻辑左移和逻辑右移,只要进行左移,先将其转换为补码,之后最高位不变,左边补0即可。该数呈2倍增长。

       关于左右移万万不可移动负数位。 

总结: 

       要想学好位操作符就一定要学好原反补码,这样才能更好的学习C语言。位操作符都是按照补码进行位操作的,同理,结果也是补码,所以要转换为原码得出正确结果。按位取反包括符号位。

       这里我们结合其他操作符来使用其他例子帮助小伙伴来更好的理解。

逻辑操作符

&&

       逻辑与:逻辑操作符,一假则假,1&&0结果为0,5&&0结果为0,5&&3结果为1。

|| 

        逻辑或:逻辑操作符,一真则真,5||0结果为1。

其他操作符: 

sizeof

       ???这也算操作符?是的,它是函数也是操作符,计算该数据类型的大小。计算结果为无符号的整形。

++ 

       ++可以理解为自增操作符,分为前置++和后置加加。

  • 前置++:先将该数自增1,之后赋值。
    int main()
    {int a = 0, b = 0;b = ++a;//此时先执行++a,就是将a自增1//之后赋值给bprintf("b = %d\n", b);printf("a = %d\n", a);return 0;
    }

  • 后置++:先使用该数原本的值,之后该语句结束执行完成后,自增1。
    int main()
    {int a = 0, b = 0;b = a++;//此时先将a的值赋给b//之后将a自增1printf("b = %d\n", b);printf("a = %d\n", a);return 0;
    }

-- 

       也是分为 前置-- 和 后置--,其规则和 ++ 一样,这里我们不再过多赘述。

()

       注意,这也是一个操作符,是强制类型转换操作符。比如将浮点型类型强制转换为整形。

?:(三目操作符)

       什么东西?问号指数:满天星!这其实是三目操作符,它里面必须有变量。

       这其实是条件操作符:也称三目操作符,如a>b?a:b翻译的结果就是a>b吗?是大于b,就是a,否则就是b(记住是冒号)。

int main()
{//条件操作符/三目操作符int a = 10, b = 20;int max = 0;max = (a > b ? a : b);//翻译:a大于b吗?//大于b则max = a//小于b则max = b   printf("%d", max);return 0;
}

,(逗号运算符)

       从左到右依次进行,整个表达式的结果是最后一个表达式的结果。

int main()
{int a = 1, b = 2;int c = (a > b, a = b + 10, a, b = a + 1);printf("%d\n", c);return 0;
}

       这个操作符有两种意思。

  • 定义指针变量操作符:定义一个指针类型的变量。
  • 解引用操作符:若已经定义过指针变量,想通过该指针变量去访问指向的空间,就需要解引用。(详情请看指针(基础篇)-CSDN博客不影响阅读该文章)。

+=

       这个操作符其实就是……上图吧:

       当然其他的操作符也有这种用法。 

       这里还有很多类似的操作,我们不再一一赘述。 

%

       取模:其实就是除法取余数。

       负数也有取模规则,结果有第一个数的正负而定。 

整形提升

       我们知道字符在内存中也是2进制序列,那么计算机到底是如何进行字符的操作呢?比如定义的是字符型,输出的是整形,就会有暗箱操作。

        表达式的整形运算要在CPU的响应预案算起件内执行,CPU内整型元算器的操作数的字节长度一般就是int的字节长度,同时也是CPU通过寄存器的长度。

       因此即使两个char类型相加,也是难以直接实现两个8bit位直接相加运算(虽然机器指令中可能有这种bit位相加的指令),所以表达式中各种长度小于int的整型值,都必须先转换为int或unsigned int,然后才送去CPU执行运算。

       在整形提升时,char是8个比特位,有符号的情况下最高位被当为符号位。

int main()
{char a = -160;//10000000000000000000000010100000-原码//11111111111111111111111101011111-反码//11111111111111111111111101100000-补码//char只能访问1个字节01100000//最高位被当为符号位,打印的是整形,前面补符号位//00000000000000000000000001100000printf("%d\n", a);return 0;
}

  

       即使是有符号的整形,在整形提升时,也是按照最高位提升。

int main()
{char a = -1;signed char b = -1;//有符号数补码全为1,取1个字节//最高位为1,打印整形,前面补1,补码,换为原码为-1unsigned char c = -1;//无符号,-1补码还是全1,取1个字节//虽然最高位是1,但是无符号,前面补0printf("a=%d,b=%d,c=%d", a, b, c);return 0;
}

练习巩固: 

       其实和我们学的数学的加减乘除一样,这些操作符也是有优先级的。而且像读文章一样,我们是从左向右去读文章的,所以计算也大多是从左向右开始计算的,这称之为操作符的结合性。

       像有一些垃圾书籍总喜欢在这上面大做文章,出类似以下的出生代码:

        我们可以看到在各个编译器下结果不同,因为你无法确定执行的--和++哪一次结果是保留的,下面来看一些正常的练习。 

int main()
{int i = 0, a = 0, b = 2, c = 3, d = 4;i = a++ && ++b && d++;printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);return 0;
}

int main()
{int i = 0, a = 0, b = 2, c = 3, d = 4;i = a++ || ++b || d++;printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);return 0;
}

       最后,我们给出每个操作符的优先级顺序: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/203607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AMEYA360--罗姆与Quanmatic公司利用量子技术优化制造工序并完成验证

全球知名半导体制造商罗姆(总部位于日本京都市)于2023年1月起与 Quanmatic Inc.(总部位于日本东京都新宿区&#xff0c;以下简称“Quanmatic”)展开合作&#xff0c;在半导体制造工序之一的EDS工序中测试并引入量子技术&#xff0c;以优化制造工序中的组合。目前&#xff0c;双…

C#excel导入dategridview并保存到数据库/dategridview增加一行或几行一键保存数据库

excel导入到dategridview显示并保存到数据库 dategridview增加一行或几行一键保存数据库 ExcelHelper类(这个要导入NPOI包) using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using Syste…

dtaidistance笔记:dtw_ndim (高维时间序列之间的DTW)

1 数据 第一个维度是sequence的index&#xff0c;每一行是多个元素&#xff08;表示这一时刻的record&#xff09; from dtaidistance.dtw_ndim import *s1 np.array([[0, 0],[0, 1],[2, 1],[0, 1],[0, 0]], dtypenp.double) s2 np.array([[0, 0],[2, 1],[0, 1],[0, .5],[0…

Elasticsearch--解决磁盘使用率超过警戒水位线

原文网址&#xff1a;Elasticsearch--解决磁盘使用率超过警戒水位线_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决ES磁盘使用率超过警戒水位线的问题。 问题描述 当客户端向 Elasticsearch 写入文档时候报错&#xff1a; cluster_block_exception [FORBIDDEN/12/inde…

Qt进程和线程

一、进程 在设计一个应用程序时,有时不希望将一个不太相关的功能集成到程序中,或者是因为该功能与当前设计的应用程序联系不大,或者是因为该功能已经可以使用现成的程序很好的实现了,这时就可以在当前的应用程序中调用外部的程序来实现该功能,这就会使用到进程。Qt应用程序…

亿胜盈科 HT4182,HT4186,HT4188 电量均衡 同步升压型 双节理电池充电器

HT4182&#xff0c;HT4186&#xff0c;HT4188是一款5V输入&#xff0c;升压模式的充电管理IC&#xff0c;适用于双节串联鲤电池。其能自适应任意5V电源进行充电&#xff0c;并且由输入过压、欠压保护。 HT4182&#xff0c;HT4186&#xff0c;HT4188采用同步升压结构&#xff0…

基于单片机出租车计价器控制系统

**单片机设计介绍&#xff0c;基于单片机出租车计价器控制系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的出租车计价器控制系统是一个用于控制和管理出租车费用计算的电子设备。下面是一个简单的系统设计介绍&…

Windows 下 PyTorch 入门深度学习环境安装与配置 GPU 版

1.确定自己的硬件信息&#xff0c;确定电脑有英伟达 (NVIDIA)显卡 在任务栏上右键打开任务管理器 2.下载安装 Anaconda &#xff08;建议安装迅雷下载&#xff0c;同时浏览器添加扩展 “迅雷Chrome支持”&#xff09; https://www.anaconda.com/ https://repo.anaconda.com/arc…

文本编辑软件:Ulysses mac介绍说明

Ulysses mac是面向 Mac、iPhone 和 iPad 的一站式写作环境。Ulysses 提供令人愉悦、专注的写作体验&#xff0c;加上高效文稿管理、无缝同步以及灵活导出。markdown 可以直接对于文本进行不同类型的分类、编辑&#xff0c;比如标题、注解、评论之类的内容。 Ulysses让注意力专…

嵌入式学习---ARM中断控制系统

目录 外部事件与CPU的交互方式查询方式中断方式 什么是中断源S3C2440支持60个中断源FIQ和IRQ 中断处理流程将外设中断通知给CPUSUBSRCPND寄存器INTSUBMSK寄存器SRCPND寄存器INTMSK寄存器INTMOD寄存器INTPND寄存器 硬件中断处理是实时系统设计的最重要、最关键的问题。 外部事件…

Linux shell编程学习笔记33:type 命令

目录 0 引言1 type 命令的功能和格式 1.1 type命令的功能1.2 type 命令的格式2 type命令用法实例 2.1用type命令查看shell内置命令&#xff08;以echo命令为例&#xff09;2.2 用type命令查看别名&#xff08;以ls命令为例&#xff09;2.3 用type命令同时查看shell内置命令和别…

抽象类和接口(超重点!!)

[本节目标] 1.抽象类 2.接口 3.Object类 1.抽象类 1.1 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&a…

LabVIEW发开发电状态监测系统

LabVIEW发开发电状态监测系统 对发电设备的持续监测对于确保可靠的电力供应至消费者极为重要。它不仅能够及时提醒操作员注意发电设备的潜在损坏&#xff0c;还能减少由于设备故障造成的停机时间。为了达到这一目标&#xff0c;开发了一款基于LabVIEW的软件&#xff0c;专门用…

C语言进阶之路之内存镜像与字符操作函数篇

目录 一、学习目标&#xff1a; 二、内存镜像 什么是进程 C进程内存布局 栈内存 静态数据 数据段&#xff08;存储静态数据&#xff09;与代码段 堆内存 三、字符操作函数 函数strstr 函数strlen strlen与sizeof的区别 函数strtok 函数strcat与strncat 函数strc…

string类:`reserve()`,`resize()`详解

string类的重要接口说明(1)&#xff1a;reserve()&#xff0c;resize() 一、reserve() 和 resize() 注意不要把 reserve(储备) 和 reverse(逆向) 搞混了&#xff01; 1.1 reserve()&#xff1a;用于为字符串预留空间&#xff08;扩容&#xff09;&#xff0c;以便后续操作可以…

【MySQL数据类型】

目录&#xff1a; 前言数据类型分类整数类型tinyintbit 小数类型floatdecimal 字符串类型charvarchar日期和时间enum & set在集合中查找find_in_set 前言 剑指offer&#xff1a;一年又4天 数据类型分类 整数类型 tinyint 整数类型都分为有符号和无符号两种&#xff0c;默…

Linux重要基本命令

重要基本命令 1.ls命令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常见的选项包括&#xff1a; -l&#xff1a;以长格式显示文件信息&#xf…

git 使用记录

远程仓库为空初始化 初始化本地仓库 git init 在本地仓库书写代码&#xff08;这里可以编辑一个文本文件做测试&#xff0c;如hello.txt&#xff09; 5&#xff09;执行&#xff1a;git add 要让git管理的文件&#xff08;git add hello.txt&#xff09;>执行完此操作将我…

手持机|三防智能手机_4寸/5寸/6寸安卓系统三防手机PDA手持终端方案

随着科技的不断发展&#xff0c;三防手持机作为一种多功能设备&#xff0c;正逐渐在各行业得到广泛应用。这款手持机采用高性能处理器&#xff0c;支持高精度北斗定位和工业本安防爆功能&#xff0c;并具备IP67级防水防尘性能和1.5米防跌落能力。因此&#xff0c;它在仓储管理、…

【Docker】从零开始:17.Dockerfile基本概念

【Docker】从零开始&#xff1a;17.Dockerfile 概述1.什么是Dockerfile2.Dockerfile构建三大步骤3.Docker执行Dockerfile流程 一张图理解Dockerfile常用保留指令~FROM~~MAINTAINER~~RUN~两种格式 ~EXPOSE~~WORKDIR~~USER~~ENV~~ADD~~COPY~两种格式 ~VOLUME~~CMD~两种格式注意 ~…