常见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,一经查实,立即删除!

相关文章

C++中Using关键词的三种应用

引入单个名称 将某个单独名字引入到当前域中。不再需要使用作用域限定符&#xff1a;&#xff1a; 例如&#xff1a; using std::string; string s “hello,world”; using声明可以改变派生类对父类成员的访问控制。 例如&#xff1a; class Base{ protected: int n1;…

楼宇自控远程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…

ansible内置主机变量及魔法变量

目录 概述实践代码执行效果 概述 简单实用版本 实践 代码 --- - name: Get IP Addresshosts: allgather_facts: notasks:- name: Get IP Addressansible.builtin.setup:register: host_ip- name: Print IP Addressansible.builtin.debug:msg: "The IP Address of {{ a…

基于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…

SpringCloudAlibaba:3.2dubbo的高级特性

启动时检查 简介 Dubbo在启动时检查依赖得服务是否可用&#xff0c;不可用时会抛出异常&#xff0c;阻止Spring初始化完成&#xff0c;以便上线时&#xff0c;能及早发现问题 建议 如果你的Spring容器是懒加载的&#xff0c;或者通过API编程延迟引用服务&#xff0c;请关闭ch…

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

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

Django和Python版本兼容表

记录一下Python和Django版本的兼容性对照表&#xff0c;如果还在维护老的项目可以作参考&#xff1a; Django 版本Python 版本备注5.1 3.10, 3.11, 3.125.0 3.10, 3.11, 3.12最低要求Python3.104.23.8, 3.9, 3.10, 3.11, 3.12 (从4.2.8开始)4.1 3.8, 3.9, 3.10, 3.11 (…

模方已经安装了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; 《面试题大全》 — …

数据结构(二)关于空间的使用

数据结构&#xff08;二&#xff09;关于空间的使用 要点&#xff1a;解决问题的效率跟空间的利用效率有关 思考&#xff1a;如何空间的利用效率 01 如何空间的利用效率 参考&#xff1a;递归导致的栈溢出 Exception in thread "main" java.lang.StackOverflowE…

11.结构化开发

1.无直接耦合 2.数据耦合 值耦合 3.标记耦合 数据结构耦合 4.控制耦合 逻辑 顺序耦合 5.外部耦合 软件之外的联系 6.公共耦合 指通过一个公共的数据环境 7.内容耦合 一个模块直接用另一个模块的数据 8.偶然内聚 指一个模块的处理没有任何关系 9.逻辑内聚 执行若干个逻辑相似的功…

JVM的垃圾回收

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