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

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

题目

代码

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)

相关推荐
CoovallyAIHub17 小时前
工业视觉检测:多模态大模型的诱惑
深度学习·算法·计算机视觉
Jayden_Ruan18 小时前
C++分解质因数
数据结构·c++·算法
微露清风18 小时前
系统性学习C++-第二十讲-哈希表实现
c++·学习·散列表
bubiyoushang88818 小时前
MATLAB实现雷达恒虚警检测
数据结构·算法·matlab
wu_asia18 小时前
编程技巧:如何高效输出特定倍数数列
c语言·数据结构·算法
清 澜18 小时前
c++高频知识点总结 第 1 章:语言基础与预处理
c++·人工智能·面试
AlenTech18 小时前
207. 课程表 - 力扣(LeetCode)
算法·leetcode·职场和发展
fqbqrr19 小时前
2601C++,模块基础
c++
带土119 小时前
6. C++智能指针(1)
开发语言·c++
星火开发设计19 小时前
C++ queue 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识·队列