C++跳坑记:位移超出范围的处理

news/2024/7/7 20:55:58

在C++编程中,数据类型的选择不仅影响内存占用和性能,还可以对某些操作的结果产生意想不到的影响。今天,我将分享一个关于C++在不同变量类型下位移操作结果的发现。

位移操作是C++中常见的对整数的高效操作之一。然而,我们可能会忽视一个细节:不同的编译器和数据类型可能会导致位移操作的结果不同。

示例代码

让我们看一个简单的示例代码,来展示这个问题:

#include <iostream>
using namespace std;

int main() {
    int L = 512;
    for (int i = 0; i < 64; i++) {
        cout << L << " >> " << i << " = " << (L >> i) << endl;
    }
    return 0;
}

在上述代码中,我们使用了一个整数 L,并尝试对其进行右移操作,观察结果。

发现

我天真地以为,只要右移的位数超出范围结果为0。但实际结果让我出乎意料:当 i 的值达到 32 时,512 >> 32 的结果变成了 512,然后往后,512 >> 33 等于 256,512 >> 34 等于 128,如此类推。这意味着,当 i 大于等于 32 时,右移操作不再产生预期的结果,而是保持原始值,这将严重影响后续的运算结果。

解决方案

为了解决这个问题,我们尝试将 L 的数据类型更改为 long,但很遗憾结果与使用 int 类型的情况一样,仍然无法得到正确的结果。
最后,我将 L 的类型更改为 long long,才得出了预期的结果。

#include <iostream>
using namespace std;

int main() {
	// 把L的类型由int改为long long
    long long L = 512;
    for (int i = 0; i < 64; i++) {
        cout << L << " >> " << i << " = " << (L >> i) << endl;
    }
    return 0;
}

运行结果截图

在这里插入图片描述


http://lihuaxi.xjx100.cn/news/1555922.html

相关文章

【Linux旅行记】探究操作系统是如何进行管理的!

文章目录 什么是操作系统&#xff1f;操作系统概念操作系统的目的底层硬件驱动程序操作系统理解系统调用接口 操作系统是如何进行管理的&#xff1f;什么是管理&#xff1f;操作系统是如何管理硬件信息呢&#xff1f; &#x1f340;小结&#x1f340; &#x1f389;博客主页&am…

代理IP与Socks5代理:跨界电商时代的网络安全与数据引擎

第一部分&#xff1a;跨界电商与出海战略 1.1 跨界电商的崛起 跨界电商是指企业通过互联网销售跨足不同国家和地区市场的产品和服务。它已经成为全球贸易的重要组成部分&#xff0c;为企业提供了全球市场的无限机会。 1.2 出海战略的重要性 出海战略是企业拓展国际市场的核…

Test?

加醋 红色

[NLP] LLM---<训练中文LLama2(三)>对LLama2进行中文预料预训练

预训练 预训练部分可以为两个阶段&#xff1a; 第一阶段&#xff1a;冻结transformer参数&#xff0c;仅训练embedding&#xff0c;在尽量不干扰原模型的情况下适配新增的中文词向量。第二阶段&#xff1a;使用 LoRA 技术&#xff0c;为模型添加LoRA权重&#xff08;adapter&…

服务器搭建(TCP套接字)-select版(服务端)

一、select头文件 #include <sys/select.h>二、select原型 int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);select() 是一个系统调用函数&#xff0c;用于在多个文件描述符上进行 I/O 多路复用。通过 select() …

vue一直自动换行问题解决

html换行主要是由于< div >标签引起的&#xff0c;而vue的一些前端组件本身就会自带< div >&#xff0c;比如el-input的标签拆分出来之后就形成了如下的内容 因此之前我采用 <el-form-item prop"code" v-if"captchaOnOff"><el-inpu…

JavaScript之字符串方法

目录 一、 字符串截取1. substring()2. substr()3. slice() 二、 下标方法三、字符串连接方法concat方法 四、大小写转换方法五、查找索引方法六、替换内容方法七、去掉空格方法八、字符串转数组的方法 一、 字符串截取 字符串截取是字符串中非常实用的方法之一&#xff0c;可以…

原生小程序生命周期,路由跳转,本地存储等详解

原生小程序生命周期&#xff0c;路由跳转&#xff0c;本地存储等详解 生命周期&#xff0c;路由跳转&#xff0c;本地存储等API详解 原生小程序&#xff08;Native Mini Program&#xff09;是一种在微信小程序平台上开发的小程序类型&#xff0c;与传统的小程序开发方式&#…