整型的不同类型和溢出

news2025/3/10 8:39:42

一、整数的不同类型

不同编程语言中的整数类型主要通过以下两个维度区分:

1. 存储大小

  • 字节数:决定整数能表示的范围(如 1字节=8位)。

  • 常见类型

    • byte(1字节)、short(2字节)、int(4字节)、long(8字节)。

2. 是否有符号(Signed vs Unsigned)

  • 有符号整数(Signed):支持正负值,最高位为符号位。

    • 例如:int 的范围是 -2,147,483,648 到 2,147,483,647(4字节)。

  • 无符号整数(Unsigned):仅支持非负值,所有位用于表示数值。

    • 例如:unsigned int 的范围是 0 到 4,294,967,295(4字节)。

二、整数溢出(Integer Overflow)

当整数超出其类型能表示的范围时,会发生溢出。不同语言对溢出的处理方式不同。

1. 溢出原理

  • 假设一个 4字节有符号整数(范围:-2^31 到 2^31-1):

    • 最大值:2,147,483,647(二进制 0111...1111)。

    • 加 1 后:2,147,483,648,但会溢出为 -2,147,483,648(二进制 1000...0000)。

2. 不同语言的溢出行为

三、实际代码示例

#include <stdio.h>
int main() {
    int a = 2147483647; // int 最大值
    a += 1; // 未定义行为!可能输出 -2147483648 或其他值
    printf("%d\n", a);
    return 0;
}

四、如何避免溢出问题?

1.选择合适的数据类型

  • 预估数值范围(例如全球人口用 long 而非 int)。

2.使用高精度类型

  • Python 的 int、Java 的 BigInteger

3.启用溢出检查

  • C# 的 checked 关键字、Rust 的默认溢出检查。

4.手动检查边界

#include <stdio.h>
#include <limits.h>  // 包含 INT_MAX 和 INT_MIN

// 检查 a + b 是否会溢出,返回 1 表示溢出,0 表示安全
int add_will_overflow(int a, int b) {
    if (b > 0) {
        // 正溢出检查:a + b > INT_MAX
        if (a > INT_MAX - b) {
            return 1; // 溢出
        }
    } else if (b < 0) {
        // 负溢出检查:a + b < INT_MIN
        if (a < INT_MIN - b) {
            return 1; // 溢出
        }
    }
    // 如果 b == 0 或未溢出,返回 0
    return 0;
}

int main() {
    int a = INT_MAX - 5;
    int b = 10;

    if (add_will_overflow(a, b)) {
        printf("溢出!无法安全相加 %d + %d\n", a, b);
    } else {
        printf("安全相加:%d + %d = %d\n", a, b, a + b);
    }

    return 0;
}

 

 

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

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

相关文章

使用express创建服务器保存数据到mysql

创建数据库和表结构 CREATE DATABASE collect;USE collect;CREATE TABLE info (id int(11) NOT NULL AUTO_INCREMENT,create_date bigint(20) DEFAULT NULL COMMENT 时间,type varchar(20) DEFAULT NULL COMMENT 数据分类,text_value text COMMENT 内容,PRIMARY KEY (id) ) EN…

小程序 wxml 语法 —— 41列表渲染 - 进阶用法

这一节讲解列表渲染的两个进阶用法&#xff1a; 如果需要对默认的变量名和下标进行修改&#xff0c;可以使用 wx:for-item 和 wx:for-item&#xff1a; 使用 wx:for-item 可以指定数组当前元素的变量名使用 wx:for-index 可以指定数组当前下标的变量名 将 wx:for 用在 标签上&…

python语言总结(持续更新)

本文主要是总结各函数&#xff0c;简单的函数不会给予示例&#xff0c;如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示&#xff0c;用以提示用户)输入函数 注释 # 单行注释符&…

FPGA学习篇——Verilog学习5(reg,wire区分及模块例化)

1 何时用reg&#xff0c;何时用wire&#xff1f; 这个我找了一些网上的各种资料&#xff0c;大概说一下自己的理解&#xff0c;可能还不太到位... wire相当于一根线&#xff0c;是实时传输的那种&#xff0c;而reg是一个寄存器&#xff0c;是可以存储数据的&#xff0c;需要立…

Redis 数据持久化之AOF

AOF&#xff08;Append Only File&#xff09; 以日志的形式来记录每个写操作&#xff0c;将Redis执行过的所有写指令记录下来&#xff08;读操作不记录&#xff09;&#xff0c;只许追加文件但不可以改写文件&#xff0c;redis启动之初会读取该文件重新构建数据&#xff0c;换…

【芯片验证】verificationguide上的74道SystemVerilog面试题

诧异啊,像我这种没事在网上各处捡东西吃的人为什么之前一直没有用过verificationguide这个网站呢?总不能是大家都已经看过就留下我不知道吧。前几天在论坛上和朋友谈论验证面试题时才搜到这个网站的,感觉挺有意思: .: Verification Guide :.​verificationguide.com/https…

Java后端高频面经——计算机网络

TCP/IP四层模型&#xff1f;输入一个网址后发生了什么&#xff0c;以百度为例&#xff1f;&#xff08;美团&#xff09; &#xff08;1&#xff09;四层模型 应用层&#xff1a;支持 HTTP、SMTP 等最终用户进程传输层&#xff1a;处理主机到主机的通信&#xff08;TCP、UDP&am…

面试题(二)--Object中的常见方法

Object Java的Object是所有Java类的父类&#xff0c;所有的Java类直接或者间接的继承了Object类&#xff0c;Object类位于java.lang包中&#xff08;编译时自动导入&#xff09;&#xff0c;主要提供了11种方法。 /*** native 方法&#xff0c;用于返回当前运行时对象的 Class…

运行OpenManus项目(使用Conda)

部署本项目需要具备一定的基础&#xff1a;Linux基础、需要安装好Anaconda/Miniforge&#xff08;Python可以不装好&#xff0c;直接新建虚拟环境的时候装好即可&#xff09;&#xff0c;如果不装Anaconda或者Miniforge&#xff0c;只装过Python&#xff0c;需要确保Python是3.…

设备管理系统功能与.NET+VUE(IVIEW)技术实现

在现代工业和商业环境中&#xff0c;设备管理系统&#xff08;Equipment Management System&#xff0c;简称EMS&#xff09;是确保设备高效运行和维护的关键工具。本文采用多租户设计的设备管理系统&#xff0c;基于.NET后端和VUE前端&#xff08;使用IVIEW UI框架&#xff09…

数据类设计_图片类设计之2_无规则图类设计(前端架构基础)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇数据类设计_图片类设计之1_矩阵类设计(前端架构基础)-CSDN博客,讨论非规则图类型的设计 无规则图的简单定义 前面的矩阵类,有明显的特征:长,宽,行和…

aws(学习笔记第三十二课) 深入使用cdk(API Gateway + event bridge)

文章目录 aws(学习笔记第三十二课) 深入使用cdk学习内容&#xff1a;1. 使用aws API Gatewaylambda1.1. 以前的练习1.2. 使用cdk创建API Gateway lambda1.3. 确认cdk创建API Gateway lambda 2. 使用event bridge练习producer和consumer2.1. 代码链接2.2. 开始练习2.3. 代码部…

计算机视觉算法实战——老虎个体识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域介绍 老虎个体识别是计算机视觉中的一个重要应用领域&#xff0c;旨在通过分析老虎的独特条纹图案&#xff0c;自动识别和区…

Qt添加MySql数据库驱动

文章目录 一. 安装MySql二.编译mysql动态链接库 Qt版本&#xff1a;5.14.2 MySql版本&#xff1a;8.0.41 一. 安装MySql 参考这里进行安装&#xff1a;https://blog.csdn.net/qq_30150579/article/details/146042922 将mysql安装目录里的bin&#xff0c;include和lib拷贝出来…

蓝桥杯备考:图论初解

1&#xff1a;图的定义 我们学了线性表和树的结构&#xff0c;那什么是图呢&#xff1f; 线性表是一个串一个是一对一的结构 树是一对多的&#xff0c;每个结点可以有多个孩子&#xff0c;但只能有一个父亲 而我们今天学的图&#xff01;就是多对多的结构了 V表示的是图的顶点集…

【每日学点HarmonyOS Next知识】输入框自动获取焦点、JS桥实现方式、Popup设置全屏蒙版、鼠标事件适配、Web跨域

1、HarmonyOS TextInput或TextArea如何自动获取焦点&#xff1f; 可以使用 focusControl.requestFocus 对需要获取焦点的组件设置焦点&#xff0c;具体可以参考文档&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attribut…

网络空间安全(19)CSRF攻防

一、简介 跨站请求伪造&#xff08;Cross-Site Request Forgery&#xff0c;简称CSRF&#xff09;是一种网络攻击方式。攻击者通过诱导受害者访问恶意页面&#xff0c;利用受害者在被攻击网站已经获取的注册凭证&#xff08;如Cookie&#xff09;&#xff0c;绕过后台的用户验证…

DEV C++安装

点击----我接受 点击--下一步 选择安装路径&#xff1a; D盘安装选择路径&#xff1a; 点击----安装等待安装完成点击---完成即可 一路下一步即可

ESP32驱动OV3660摄像头实现物体轮廓识别(摄像头支持红外夜视、边缘AI计算)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 ESP32-S3 AI智能摄像头模块是一款专为智能家居和物联网应用打造的高性能边缘AI开发模组。它集成了摄像头、麦克风、音频功放、环境光传感器和夜视补光灯,无需依赖云端即可实现本地化AI推理。 凭借TensorFlow Lite、YOLO和O…

深入探讨 Docker 层次结构及其备份策略20250309

深入探讨 Docker 层次结构及其备份策略 本文将深入探讨 Docker 层次结构 以及在 不同场景下应选择哪种备份方式。通过本文的介绍&#xff0c;您将对如何高效地管理和迁移 Docker 容器有更深的理解。 &#x1f4cc; 什么是 Docker 层次结构&#xff1f; Docker 镜像采用了 分…