棋盘放麦子【指数爆炸问题】--位运算:左/右移--对数据溢出的理解

棋盘放麦子【指数爆炸问题】--对数据溢出的理解

题目

代码

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    // 正确实现:使用无符号类型和位运算
    unsigned long long total = (1ULL << 63) * 2 - 1; 
     //2^0 + 2^1 + ... + 2^63 = 2^64 - 1【等比数列公式得出】 等价2^64-1
    //位运算 【左移】 1ULL << 63能精确表示2^63,再乘2得到2^64
    
    左移运算<<是CPU基础指令,比函数调用(如pow)快数千倍
    但是 左/右移运算的优先级小于运算符,固一定要加括号
    左移=2的n次方
    右移运算=除以2
    
    cout << total;  // 输出18446744073709551615
    return 0;
}

数据类型的选择

判断正负:

需要负数 → 选有符号类型(int, long)

只需非负 → 选无符号(unsigned...,容量翻倍)

1ULL是什么

1ULL是什么?

字母含义:

U → 无符号(Unsigned,只存非负数)

LL → 超长整型(Long Long,64位存储)

遇到溢出怎么办:

现象:正数变负数/结果异常小

对策:升级到更大的类型(如int→long→unsigned long long)

相关推荐
皮皮哎哟7 分钟前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序
程序员清洒16 分钟前
CANN模型剪枝:从敏感度感知到硬件稀疏加速的全链路压缩实战
算法·机器学习·剪枝
vortex529 分钟前
几种 dump hash 方式对比分析
算法·哈希算法
堕2741 小时前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法
初願致夕霞1 小时前
Linux_进程
linux·c++
2302_813806221 小时前
【嵌入式修炼:数据结构篇】——数据结构总结
数据结构
Thera7772 小时前
【Linux C++】彻底解决僵尸进程:waitpid(WNOHANG) 与 SA_NOCLDWAIT
linux·服务器·c++
Wei&Yan2 小时前
数据结构——顺序表(静/动态代码实现)
数据结构·c++·算法·visual studio code
wregjru2 小时前
【QT】4.QWidget控件(2)
c++
浅念-2 小时前
C++入门(2)
开发语言·c++·经验分享·笔记·学习