C学习:移位幻影之左移一个负数,会发生什么?

C学习:移位幻影之左移一个负数,会发生什么?

    • 问题背景
    • 无符号数移位问题
    • 有符号数移位操作使低位置零问题

问题背景


C语言中,移位是个简单的问题,但又是个高风险的问题。

简单在于,大部分场景都可以理解为乘或除2的幂。风险在于,C语言中对有符号数的移位与无符号数的移位异常场景,未定义:

  • 不同位宽转换时的移位过程如何处理?
  • 有符号数的左右移动,是逻辑移位,还是带符号移位?
  • 无符号数的移动中,移动数为负或超过了符号位宽如何处理?

前两问题中,在《C学习:无符号有符号数的移位问题分析总结》和《C学习:隐藏在负数移位过程中的bug》有过一些探讨,这里就第最后一个问题做一些小结。

无符号数移位问题


之前在《C学习:一个百思不得其解的无符号数移位问题》,也初步聊过,但无法解释下面这个问题。

1<<-1,对无符号数如1左移-1位会发生什么?

照例,先问下AI大模型看它如何应对。Prompt提问是:C语言中,执行这段语句:int b = 1 << -1, 会发生什么?

Copilot回答如下:

在C语言中,执行语句 int b = 1 << -1; 会导致未定义行为。原因如下:

  1. 位移操作符<< 是左移操作符,用于将一个整数的二进制位左移指定的位数。
  2. 负数位移:标准C语言不允许负数位移。位移操作的位数必须是非负整数。

因此,1 << -1 是非法的,会导致未定义行为。这意味着程序的行为是不可预测的,可能会导致程序崩溃或产生错误的结果。

我理解,不可预测指的是该操作的结果有多义性,具体行为取决于编译器处理,比如可能结果:

  • 为0,编译器翻译为右移1位,1>>1
  • 直接报错返回,编译器直接返回运行错误码

我的环境,跑的结果是0,会告警,但不会报错。错的是将其作为除数,导致浮点除零。但编译器也没中断,而是将结果存为一个极小值,继续运行。

有符号数移位操作使低位置零问题


t = (t << 8) >> 8,此代码中,t为有符号数int类型,移位结果是否固定?

显然,前文说过,有符号数移位是未定义行为,可能是算术,也可能是逻辑移位。但多数编译器,是使用的算术移位,即带符号移位。

所以,一般场景而言,该行代码能实现有符号数的低8位比特置零的效果。

但是,假如我们不允许对有符号数进行移位,该如何实现有符号数低8位置零操作呢?

容易想到的是,C语言中可通过除法这样实现:t = t / 256 * 256

扩展思考的是,可否不用除法,将有符号数移位过程等价转换到无符号数的位操作上去,从而更高效的实现?

   /*  Write C code in this online editor and run it. */printf("Hello, World! \n");int num = -10;unsigned int numVer = num;printf("0x%x\n", numVer);num = -33554432; // -2^25()printf("0x%x\n", num);int num_shift = (num << 8) >> 8;printf("0x%x\n", num_shift);

仍存疑中。

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

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

相关文章

芯驰X9SP与汽车麦克风-打造无缝驾驶体验

当今汽车技术的进步不仅提升了驾驶体验&#xff0c;还改变了我们与车辆互动的方式。汽车麦克风作为车内语音控制系统的重要组成部分&#xff0c;正逐渐成为现代汽车的标配。 技术原理 汽车麦克风主要依赖于声音传感技术&#xff0c;通常包括电容式麦克风和动圈式麦克风。这些…

tomcat的Mysql链接字符串问题

tomcat配置mysql链接需要改server.xml或content.xml。 但是server.xml或content.xml中mysql的配置看起来很古怪: url"jdbc:mysql://10.21.0.6:3306/hrdatabase?characterEncodinggbk&amp;autoReconnecttrue" 而使用springboot开发java应用&#xff0c;使用ya…

界面控件Syncfusion Essential Studio®现在已完全支持 .NET 9

Syncfusion Essential Studio现在完全支持 .NET 9&#xff0c;可最新版本2024 Volume 3 版本中使用&#xff01;通过此更新&#xff0c;Blazor、.NET MAUI、WPF、WinForms、WinUI和ASP.NET Core 平台中的 Syncfusion 组件以及文档处理库已准备好让您利用 .NET 9 中的最新功能。…

剑指offer(专项突破)---字符串

总目录&#xff1a;剑指offer&#xff08;专项突破&#xff09;---目录-CSDN博客 1.字符串的基本知识 C语言中&#xff1a; 函数名功能描述strcpy(s1, s2)将字符串s2复制到字符串s1中&#xff0c;包括结束符\0&#xff0c;要求s1有足够空间容纳s2的内容。strncpy(s1, s2, n)…

ORB-SLAM2源码学习:MapPoint.cc:MapPoint::UpdateNormalAndDepth()计算平均观测方向以及观测距离范围1

前言 这个函数是属于地图点属性的一部分。 1.函数声明 void MapPoint::UpdateNormalAndDepth() {.... } 2.函数定义 1.获取观测到该地图点的所有关键帧的信息 map<KeyFrame*,size_t> observations;KeyFrame* pRefKF;cv::Mat Pos;{unique_lock<mutex> lock1(…

【JVM什么时候触发YoungGC和FullGC】

YoungGC 年轻代Eden区满&#xff0c;就会触发YoungGC FullGC 老年代空间不足 经过多次GC后的大年龄对象会被放进老年代&#xff0c;或创建的大对象会直接在老年代分配&#xff0c;此时若老年代空间不足&#xff0c;就会触发FullGC。空间分配担保失败 触发YoungGC的时候会进行…

用“*”构成一个倒三角形:JAVA

输入&#xff1a;5 输出&#xff1a; ******* ***** *** * 代码&#xff1a; import java.util.Scanner; //倒三角 public class FF6 {public static void main(String[] args) {Scanner scannernew Scanner(System.in);while (scanner.hasNextInt()){int nscanner…

充分统计量(Sufficient Statistic)概念与应用: 中英双语

充分统计量&#xff1a;概念与应用 在统计学中&#xff0c;充分统计量&#xff08;Sufficient Statistic&#xff09; 是一个核心概念。它是从样本中计算得出的函数&#xff0c;能够完整且无损地表征样本中与分布参数相关的信息。在参数估计中&#xff0c;充分统计量能够帮助我…

ubuntu环境下安装electron环境,并快速打包

1.配置镜像源 关闭防火墙&#xff0c;命令&#xff1a;sudo ufw disable 1.1配置国内镜像源&#xff1a; vim /etc/apt/source.list deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb-src https://mirrors.aliyun.com/ubuntu/ jammy main…

【eclipse】快捷键

【eclipse】快捷键 编辑导航重构调试复制其他快速生成 Eclipse 提供了丰富的快捷键来帮助开发者提高工作效率。 以下是一些常用的 Eclipse 快捷键&#xff0c;它们覆盖了编辑、导航、重构、调试等多个方面。 这些快捷键能够显著提升开发效率&#xff0c;尤其是在处理大型项目时…

yarn : 无法加载文件 E:\node\node_global\yarn.ps1,因为在此系统上禁止运行脚本

先确保安装了yarn —— npm install -g yarn 终端输入set-ExecutionPolicy RemoteSigned 若要在本地计算机上运行您编写的未签名脚本和来自其他用户的签名脚本&#xff0c;请使用以下命令将计算机上的执行策略更改为RemoteSigned 再去使用yarn okk~

python学opencv|读取视频(二)制作gif

【1】引言 前述已经完成了图像和视频的读取学习&#xff0c;本次课学习制作gif格式动图。 【2】教程 实际上想制作gif格式动图是一个顺理成章的操作&#xff0c;完成了图像和视频的处理&#xff0c;那就自然而然会对gif的处理也产生兴趣。 不过在opencv官网、matplotlib官网…

高校心理教育辅导|基于springBoot的高校心理教育辅导系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 随着Internet技术的发展&#xff0c;心理教育辅导系统应运而生&…

dreamerv3复现教程

dreamerv3复现教程 &#xff11;、dreamerv3基础安装&#xff12;、gym0.19.0安装3、JDK8安装&#xff14;、mineRL&#xff10;.4.4安装&#xff15;、diamond_env安装 由于dreamerv3存在很多版本冲突问题&#xff0c;所以很难直接使用和复现 &#xff11;、dreamerv3基础安装…

Mock 对象 详解

Mock 对象详解 Mock 对象 是软件测试中常用的技术&#xff0c;用于模拟实际对象的行为&#xff0c;以便隔离待测试的代码&#xff0c;与其他依赖解耦&#xff0c;进行单元测试。通过 Mock 对象&#xff0c;我们可以控制依赖对象的行为&#xff0c;使得测试更专注于被测单元的功…

如何参加华为欧拉考试?

华为欧拉考试主要针对的是华为欧拉&#xff08;EulerOS/openEuler&#xff09;操作系统的认证考试&#xff0c;这一认证体系旨在培养和认证具备基于欧拉操作系统进行企业级应用运行基础环境搭建、管理和调测能力的工程师以及云计算架构师。以下是对华为欧拉考试的详细介绍&…

网络安全、Web安全、渗透测试之笔经面经总结(一)

本篇文章总结涉及以下几个方面&#xff1a; 一&#xff1a;对称加密非对称加密&#xff1f; 对称加密&#xff1a;加解密用同一密钥&#xff0c;密钥维护复杂n&#xff08;n-1&#xff09;/2&#xff0c;不适合互联网传输密钥&#xff0c;加解密效率高。应用于加密数据。 非…

Nginx静态资源配置

基本配置原则 明确资源目录&#xff1a;为不同类型的静态资源指定不同的路径&#xff0c;这样可以避免路径冲突&#xff0c;并且便于管理。正确设置文件权限&#xff1a;确保 Nginx 具有读取静态资源的权限。缓存优化&#xff1a;为静态资源设置缓存头&#xff08;如 expires&…

Influxdb 基础操作

InfluxDB是一个由InfluxData开发的开源时序数据库&#xff0c;专为高性能地查询与存储时序数据而设计。以下是对InfluxDB基础操作的介绍&#xff1a; 一、数据库操作 创建数据库 使用CREATE DATABASE语句可以创建一个新的数据库。例如&#xff0c;创建一个名为example_db的数…

bert-base-uncased模型的tokenizer.json和vocab.txt的区别和联系

说在前面 突然发现这两个文件是由区别的&#xff0c;之前傻傻的把两个文件都下载到模型里面了&#xff0c;transformers工具包使用bert加载分词器时并不是都需要这两个文件的&#xff0c;而是工具加载器类型类具体决定的。 vocab.txt 的作用 词汇表文件&#xff0c;通常是一…