C语言编程题(二)运算符与位运算符优先级

#include <stdio.h>int main()
{
unsigned char a=0xa5;
unsigned char b=~a>>4+1;
printf("b=%d",b);
return 0;}

错误思路:

unsigned char占一个字节,即8bit,将a写入内存中的形式为:

1010 0101

按照常规来说,将a取反为

0101 1010

然后再右移动5个为

0000 0010

结果为2。

但是这里特别要注意一点,低于int类型(即规定的寄存器大小)的基础类型需要在运算过程中转化为int类型(寄存器的位数)的大小进行计算(为了保证运算的一致性和精确性,编译器会将较小的整数类型自动提升为int类型,并在进行运算时使用int类型的规则),然后在运算完成以后再截取成原大小进行结果的表示,所以这里的过程应该改为:

正确思路:

1010 0101

在16bit的寄存器中转化为

0000 0000 1010 0101

全部取反得到

1111 1111 0101 1010

而后右向移动5个,左边补0:

0000 0111 1111 1010

运算完成,开始从右边截取出unsigned char对应位数的值

1111 1010

该数值为内存中对应数字的补码形式,但是由于是unsigned型,所以相当于可以直接取用为原码形式:

即250

这里补充一个取反操作的知识点,我们在学习取反~这个操作

初学者在没有了解内存是如何存储数据的情况下往往会发现

取反之后读取内存中的数字有的时候是需要对内存中的数字取反加一再补负号

而有一些则直接取出当成结果就好,这是为什么呢?

1.一个数字存入内存中的时候,不是直接转为二进制直接存储的,编译器需要把当前数字转化为其对应的补码存入内存当中:正数的补码就是其原码(即其本身),而负数则需要对其取绝对值再加一。

例1.

-5(char型)转化为补码的方式为首先转为绝对值:

0000 0101 接着取反

1111 1010 再加1

1111 1011 这就是-5在内存中的表现形式

例2.

5的原码为0000 0101,其补码也为0000 0101

2.在内存中,若当前数字的补码最高位为1:表示这个数字为一个负数;需要取出这个数字的时候就需要首先对这个数字进行取反然后加一再补负号还原这个数字

在内存中,若当前数字的最高位为0:则这个数字表示一个正数,不需要转化可以直接取出来使用

例1.

需要把-5这个数字从内存中取出

1111 1011 首先取反

0000 0100 然后加一

0000 0101表示5,再补符号

-5 取出成功

例2.

在内存中取出5这个数字:

0000 0101

直接取出的到5即可

3.如何判断当前数字在取反后从内存取出时应不应该执行取反加一再加符号的操作:根据上面两条,由于取出数字是在内存当中执行的,所以我们要在取出的时候查看当前数字最高位是否是1,若发现当前数字在完成取反操作以后结果最高位为1是负数,则需要取反加一,反之不需要。

例1.

-5在内存当中表示

1111 1011 进行取反操作得到

0000 0100 编译器判断当前数字取反以后变成了正数,在取出这个数字时就不需哟取反加一了

结果就是4

例2.

5在内存中表示为

0000 0101 取反操作

1111 1010 编译器判断高位为1是负数,则需要取反加一补符号

0000 0101 先取反然后再加1

0000 0110的到结果6再补符号

~5的结果为-6

====================================================================================

其实这里也可以直接记成~-5前面是减号,就是5-1=4,结果就是4

~5的前面是正号,就是-(5+1)=-6

标签: 位运算

原文关于unsigned char的取反操作 - 雾漫大武汉 - 博客园 (cnblogs.com)

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

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

相关文章

Matlab之并行程序设计实战教程

在本教程中&#xff0c;我们将介绍如何使用Matlab进行并行程序设计。我们将通过一个简单的示例来演示如何将串行代码转换为并行代码&#xff0c;以提高程序的执行效率。 示例&#xff1a;计算一个数组的平方和 假设我们有一个包含10000个元素的数组&#xff0c;我们想计算该数…

OkHttp 根据服务器返回的的过期时间设置缓存

据返回的缓存时间来缓存响应&#xff0c;可以通过使用OkHttp的CacheControl和ResponseCacheInterceptor来实现。以下是一个示例代码&#xff1a; // 创建缓存目录和缓存对象 File cacheDirectory new File(context.getCacheDir(), "http-cache"); int cacheSize 1…

[运维|数据库] 在 PostgreSQL 中使用正则表达式进行模式匹配

以下是如何在 PostgreSQL 中使用正则表达式进行模式匹配&#xff1a; SELECT column_name FROM your_table WHERE column_name ~ your_pattern;在上面的查询中&#xff1a; column_name 是您要搜索的列名。 your_table 是包含数据的表名。 ‘your_pattern’ 是您的正则表达式…

【面试刷题】——堆栈窗口

“堆栈窗口”&#xff08;Stack Window&#xff09;通常不是一个特定的编程术语&#xff0c;但可以用来描述在编程和计算机科学领域中一些相关的概念。这些概念涉及到堆栈&#xff08;stack&#xff09;和窗口&#xff08;window&#xff09;等术语的组合。以下是一些可能涉及到…

JVM——3.StringTable字符串常量池

这篇文章我们来讲一下StringTable字符串常量池 目录 1.引例 2.StringTable的特性 3.StringTable的位置 4.StringTable的垃圾回收、 5.StringTable性能调优 6.总结 1.引例 首先&#xff0c;我们来看下面的这段程序&#xff0c;请思考最终的输出结果。 输出结果&#xff…

Multitor:一款带有负载均衡功能的多Tor实例创建工具

关于Multitor Multitor是一款带有负载均衡功能的多Tor实例创建工具&#xff0c;Multitor的主要目的是以最快的速度完成大量Tor进程的初始化&#xff0c;并将大量实例应用到我们日常使用的程序中&#xff0c;例如Web浏览器和聊天工具等等。除此之外&#xff0c;在该工具的帮助下…

常用设计模式总结 + 实例

工厂模式 工厂函数通常是指一个函数&#xff0c;它用来创建和返回其他函数或对象的实例。 人话&#xff1a; 当new Class 或 Function 时&#xff0c;根据传入的参数&#xff0c;而返回不同的值&#xff0c;这就是工厂模式。 &#xff08;所以可以说&#xff0c;这是我们开…

vscode如何设置文件折叠

随着项目的不断迭代开发&#xff0c;复杂度越来越高&#xff0c;配置文件越来越多&#xff0c;导致vscode左侧文件列表展示非常不直观&#xff0c;幸好可以通过文件折叠来简化展示效果&#xff0c;把同类相关的文件折叠在一块展示&#xff0c;方便查看配置文件。配置好后的效果…

React 开发一个移动端项目(2)

配置基础路由 目标&#xff1a;配置登录页面的路由并显示在页面中 步骤&#xff1a; 安装路由&#xff1a; yarn add react-router-dom5.3.0 5 和 6 两个版本对组件类型的兼容性和函数组件支持有所改变&#xff0c;在这里使用的是 5。 和路由的类型声明文件 yarn add types…

VTK 基础入门 ( 一 ) 相机设置

/** 相机 SetClippingRange()/SetFocalPoint() / SetPosition()分别用于设置相机的前后裁剪平面、焦点和位置。 ComputeViewPlaneNormal()方法是根据设置的相机位置、焦点等信息&#xff0c;重新计算视平面 (View Plane)的法向量。 一般该法向量与视平面是垂直…

基于 kubernetes+docker构建高可用、高性能的 web 、CICD集群

文章目录 一、项目架构图二 、项目描述三、项目环境四、环境准备1、IP地址规划2、关闭selinux和firewall3、配置静态ip地址4、修改主机名5、升级系统&#xff08;可做可不做&#xff09;6、添加hosts解析 五、项目步骤1、设计整个集群的架构&#xff0c;规划好服务器的IP地址&a…

Postgresql中检测内存越界或use after free的简便方法

1 使用场景 在Postgresql的内存管理模块中&#xff0c;最常用的aset.c提供的内存池实现&#xff0c;该实现提供了两个非常实用的开关来解决常见的内存越界问题&#xff1a; memdebug.c * About CLOBBER_FREED_MEMORY:** If this symbol is defined, all freed memory is over…

AIGC专栏6——通过阿里云与AutoDL快速拉起Stable Diffusion和EasyPhoto

AIGC专栏6——通过阿里云与AutoDL快速拉起Stable Diffusion和EasyPhoto 学习前言Aliyun DSW快速拉起&#xff08;新用户有三个月免费时间&#xff09;1、拉起DSW2、运行Notebook3、一些小bug AutoDL快速拉起1、拉起AutoDL2、运行Notebook 学习前言 快速拉起AIGC服务 对 用户体…

Debian 12快速安装图解

文章目录 Debian 12安装图解创建虚拟机安装系统登录并用光盘离线安装sudo、curl解决Linux下sudo更改文件权限报错保存快照debain添加在线源(配置清华源)参考 Debian 12安装图解 Debian选择CD安装非常慢&#xff0c;本次安装选择DVD离线安装。 下载 https://www.debian.org/CD…

大范围XSS扫描工具:XSS-Freak,BurpSuite随机用户代理,Hades 静态代码审核系统

大范围XSS扫描工具&#xff1a;XSS-Freak&#xff0c;BurpSuite随机用户代理&#xff0c;Hades 静态代码审核系统。 #################### 免责声明&#xff1a;工具本身并无好坏&#xff0c;希望大家以遵守《网络安全法》相关法律为前提来使用该工具&#xff0c;支持研究学习…

【AIGC】Stable Diffusion Prompt 每日一练0916

一、前言 1.1 写在前面 本文是一个系列&#xff0c;有点类似随笔&#xff0c;每天一次更新&#xff0c;重点就Stable Diffusion Prompt进行专项训练&#xff0c;本文是第022篇《Stable Diffusion Prompt 每日一练0916》。上一篇《Stable Diffusion Prompt 每日一练0915》 1.…

ES6中新增加的Proxy对象及其使用方式

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Proxy对象的基本概念Proxy对象的主要陷阱&#xff08;Traps&#xff09; ⭐ 使用Proxy对象⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来…

开源项目-SeaTunnel-UI数据集成系统

哈喽,大家好,今天给大家带来一个开源项目-SeaTunnel-UI数据集成系统 系统主要有任务配置,任务实例,数据源,虚拟表,用户管理等功能 登录 数据源 mysql数据源配置参数说明 kafka参数配置 mysqlcdc配置参数说明 虚拟表

【自学开发之旅】Flask-标准化返回-连接数据库-分表-orm-migrate-增删改查(三)

业务逻辑不能用http状态码判断&#xff0c;应该有自己的逻辑判断。想要前端需要判断&#xff08;好多if…else&#xff09;&#xff0c;所以需要标准化&#xff0c;标准化返回。 json标准化返回: 最外面&#xff1a;data,message,code三个字段。 data&#xff1a;返回的数据 co…

索引-动图演示存储过程

索引 二叉树存储过程演示 BThree存储过程 sql二级索引搜索过程 Id是唯一键&#xff0c;聚集索引 只存在一个 Name是二级索引 可以存在多个 第一种效率更高&#xff0c;不需要回表