常见C语言基础说明二:位运算问题

 一.  简介

前面一篇文章学习了 常见的 C语言基础题,文章如下:

常见C语言基础题说明一-CSDN博客

本文继续上一篇C语言基础题的学习。

二.  C语言中 -> 位运算问题

1.  数据在计算机中的存储方式

当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。

对于有符号数最高位是符号位,0代表正数,1代表负数。

对于无符号数,全部都是正数或者0。

计算机中数值都是以补码形式表示的,这样有符号数与无符号数的运算就会统一起来,进行运算时是不会区分有符号和无符号数,最后以相应的类型解释,就得到相应的结果。

原码

有符号整数的二进制编码方式,其中最高位表示符号位,0表示正数,1表示负数。其余位表示数值的绝对值。

负数的原码是在其绝对值的基础上,最高位变为1。

例如,+10的原码为0000 1010,-7的原码为1000 1010。

总结:原码虽然转换方便,但不利于计算。

反码

反码特点:

        正数情况下与原码的值不变

        负数情况下,符号位不变,但其他部分取反(0变1,1变0)

用代码理解:

        这时转换的值=10

        原码=0000 1010; 则 反码=0000 1010;

总结:反码并不利于计算,通常用来作为求补码的中间过渡。

补码

在计算机系统中,数值一律用补码来存储

补码特点:

        对于正数来说,原码、反码、补码皆相同

        对于负数来说,其补码=它的反码加1

        补码符号位不动,其他位求反,最后整个 数+1,得到补码

        这时转换的值=10

        原码=0000 1010;则反码=0000 1010; 则补码=0000 1010;

两个用补码表示的数相加时,如果最高位(有符号位)有进位时,则进位被舍弃。

2. 位运算

无符号数就是存储过程中的最高位符号位不存在,作为数据位使用,而有符号数的最高二进制位为符号位。

无符号数据类型的移位操作

对于unsigned char、unsigned short、unsigned int、unsigned long这些无符号数据类型:

没有特殊要说明的,使用<< 和 >> 操作符就可以。

有符号数据类型的移位操作

对于char、short、int、long这些有符号的数据类型:

对负数进行左移:符号位始终为1,其他位左移
对正数进行左移:所有位左移,即 <<,可能会变成负数
对负数进行右移:取绝对值,然后右移,再取相反数(也就是补齐符号位)
对正数进行右移:所有位右移,即 >>

因为左移操作不会导致符号位出现缺位,所以不考虑符号位,低位补0即可;右移操作会涉及到符号位出现缺位的问题,所以在有符号数的右移操作时要考虑符号位怎么补的问题。

3.  位运算题目(左移)

下面变量进行位移运算后,计算其值:

#include <stdio.h>int main(void)
{ unsigned int a = 5;char b = 0x40;printf("%d\n", a<<1);printf("%d\n", (char)(b<<1));return 0;
}

打印结果如下:

分析如下:
unsigned int 类型数据为无符号数据,左移操作直接 左移即可,右边补0。所以,a左移后为 10。

char类型为有符号类型(unsigned char类型为无符号类型),char有符号数据可以表示一个字节的数据,能表示的数据范围为  -128~ +127

char 类型的  b为 0x40,二进制数表示为 0100 0000。当左移一位后,变为 1000 0000(-128的补码),打印结果是  -128。

下面解释一下为什么是  -128?

在八位二进制下,因为有一位是符号位,原码和反码只能表示 0 到 127 ,-0到-127,所以-128不能用原码或反码表示。按这种说法,但由于-128的特殊性,128 因为无法用八位二进制下的原码表示,则 -128的八位二进制下的补码也是不存在的。

但是,为了在数的表示上消除编码映射的不唯一性,所以,通过人为的定义将1000 0000 强制认定为 -128的补码。

因此,-128八位二进制下的原码和反码不存在,而八位二进制下的补码为10000000。

同时,也可以理解为 -128 的补码等于模(即256)减去其绝对值,即256-128=128,而128的二进制表示就是10000000。

综上所述,b 为 有符号 char类型,所以,这里 b 打印出来的值为  -128。

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

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

相关文章

楼宇自控远程I/O革新BACnet/IP模块在暖通空调系统

在现代智能建筑的浪潮中&#xff0c;BACnet/IP分布式远程I/O控制器正逐步成为暖通空调&#xff08;HAVC&#xff09;系统升级转型的得力助手。本文将以某大型商业综合体为例&#xff0c;揭示BACnet/IP I/O模块如何在复杂多变的环境中发挥其独特优势&#xff0c;实现HVAC系统的智…

libcity笔记:添加新模型(以RNN.py为例)

创建的新模型应该继承AbstractModel或AbstractTrafficStateModel 交通状态预测任务——>继承 AbstractTrafficStateModel类轨迹位置预测任务——>继承AbstractModel类 1 AbstractTrafficStateModel 2 RNN 2.1 构造函数 2.2 predict 2.3 calculate_loss

互联网洗鞋工厂实现新时代下的家庭洗护服务;

互联网洗鞋工厂实现新时代下的家庭洗护服务; 拽牛科技洗护系统以智慧城市系统为依托&#xff0c;洗鞋工厂为中心&#xff0c;利用互联网&#xff0b;社区服务商模式&#xff0c;实现了新时代下的家庭洗护服务&#xff0c; 将客户&#xfe63;&#xfe63;社区服务商&#xfe63…

基于Spring Boot框架实现大学生选课管理系统

文章目录 源代码下载地址项目介绍项目功能界面预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目功能 教务处管理 开课、开班审批&#xff0c;排课处理&#xff0c;班级操作&#xff0c;选课时间段管理** 使用了sql解决了开课开班的时间段的冲突…

水电抄表方案是什么?

1.概述&#xff1a;水电抄表方案的重要性 水电抄表方案是现代城市管理中不可或缺的一部分&#xff0c;它涉及到了能源管理、费用结算和公共服务等多个领域。传统的抄表方式需要工作人员上门服务&#xff0c;费时费力且效率低下。随着科技的发展&#xff0c;智能化的水电抄表方…

【高阶数据结构】图--邻接矩阵、邻接表、BFS、DFS、Kruskal、Prime

图--邻接矩阵、邻接表、BFS、DFS、Kruskal、Prime 一、图的概述1、概述&#xff08;纯理论部分&#xff09;2、邻接矩阵&#xff08;实现一个添加边的图&#xff09;&#xff08;1&#xff09;思路介绍&#xff08;2&#xff09;代码部分&#xff08;3&#xff09;测试部分 3、…

类和对象test

一、初始化列表 引言&#xff1a; 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能将其称为对对象中成员变量 的初始化&#xff0c;构造函数体中的语句只能将其称为赋初值&#xff0c;而不能称作初始化。因为初始化只能初始 化一次&#x…

【华为】AC直连二层组网隧道转发实验配置

【华为】AC直连二层组网隧道转发实验配置 实验需求拓扑配置AC数据规划表 AC的配置顺序AC1基本配置(二层通信)AP上线VAP组关联--WLAN业务流量 LSW1AR1STA获取AP的业务流量 配置文档 实验需求 AC组网方式&#xff1a;直连二层组网。 业务数据转发方式&#xff1a;隧道转发。 DHC…

SpringBoot 使用 @RequiredArgsConstructor(onConstructor_ = @Autowired) 报错解决

若使用 RequiredArgsConstructor(onConstructor_ Autowired) 启动报错&#xff0c;或者爆红可以使用以下方法解决 1. 安装或启用 Lombok插件 2. 检查 Lombok 版本 3. 若 onConstructor_ 爆红&#xff0c; 可能是IDEA中文软件包冲突 4. 若以上还是不行&#xff0c;可以添加…

模方已经安装了3dmax,也装了插件,为什么一直显示没有插件?

答&#xff1a;主要是联动2018版本&#xff0c;然后插件在模方安装时候&#xff0c;会有选项自动安装联动插件&#xff0c;SketchUp&#xff08;建议版本为2019&#xff09;&#xff0c;3dsMax&#xff08;建议版本为2018&#xff09; 模方是一款针对实景三维模型的冗余碎片、…

SpringBoot框架如何接入RocketMQ?

目录 一、SpringBoot框架介绍 二、RocketMQ介绍 三、RocketMQ的应用场景 四、SpringBoot框架如何接入RocketMQ 一、SpringBoot框架介绍 Spring Boot是一个开源的Java框架,它基于Spring框架,旨在简化Java应用程序的开发。Spring Boot通过自动化配置和约定优于配置的原则,大…

AVFilterLink的channels设置

下面这样一条命令 ffmpeg -i /Users/user/video/mp4/output.wav -ac 1 /Users/user/video/mp4/output1.wav 我们会形成下面这样的图 图1 现在有个问题link4的channel怎么设置的&#xff1f; static int pick_format(AVFilterLink *link, AVFilterLink *ref){link->cha…

猫头虎分享已解决Bug || Node.js安装失败Error: unable to connect to https://nodejs.org/猫头虎

猫头虎分享已解决Bug || Node.js安装失败Error: unable to connect to https://nodejs.org/猫头虎 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — …

JVM的垃圾回收

JVM简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机:是指通过软件模拟的具有完整硬件功能、运行在一个完全隔离的环境中完整计算机系统 1.JVM的内存区域划分 jvm是一个java进程 每一个java进程就是一个jvm实例 一个进程运行过程中 就要从操作系…

VscodeC/C++环境配置

引言 vscode是一款非常好用的编辑器&#xff0c;集成了大量的插件&#xff0c;具有很高的自由度&#xff0c;因此广受大家的喜爱。但是他本身是不带编译器的&#xff0c;因此如果要使用vscode来编译C/C程序的话&#xff0c;我们需要额外安装编译器并且为vscode配上环境。 编译…

一文教会你lambda表达式

引言 在现代编程中&#xff0c;Lambda表达式&#xff08;也称为匿名函数或闭包&#xff09;已经成为了一种非常流行的编程范式。它允许我们定义简短、一次性的函数对象&#xff0c;而无需显式地定义它们。在C11及之后的版本中&#xff0c;Lambda表达式得到了官方的支持&#x…

梦幻西游12门派复古怀旧 单机版 安装简单,云盘下载哦

做游戏开发的朋友&#xff0c;可以多参考里面的设计思想&#xff0c;真的不错。 梦幻西游12门派复古怀旧 单机版 安装简单&#xff0c;云盘下载哦 游戏大小&#xff1a; 支持系统&#xff1a;win7、win10 64位 特色&#xff1a;简化安装&#xff0c;非常容易。 重新整盒高…

Ubuntu下halcon软件的下载安装

由于工作需求&#xff0c;点云配准需要使用halcon进行实现&#xff0c;并且将该功能放入QT界面中 1.下载halcon 进入halcon官网进行下载 官网链接&#xff1a;https://www.mvtec.com/products/halcon/ 注意&#xff1a;要注册登陆之后才能进行下载 接着点击Downloads->H…

MouseBoost PRO mac中文激活版:专业鼠标助手

MouseBoost PRO mac鼠标性能优化软件&#xff0c;以其强大的功能和智能化的操作&#xff0c;助您轻松驾驭鼠标&#xff0c;提高工作效率。 MouseBoost PRO支持自定义快捷键设置&#xff0c;让您轻松实现快速切换应用程序、打开特定文件、调节音量大小等操作。自动识别窗口功能则…

240多道!Go开发岗位面试题合集(含答案)

随着今年互联网寒潮环境的影响&#xff0c;找工作的人也将达到顶峰&#xff0c;今天给大家分享一份《Go开发工程师超高频面试真题》&#xff0c;一共有240多道面试真题&#xff0c;希望能够帮助大家在面试中&#xff0c;少走一些弯路、更快拿到offer&#xff01; 内容展示 GO 基…