【C语言】整数类型及其数值范围(截断+数据)

🦄个人主页:小米里的大麦-CSDN博客

 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html

⚙️操作环境:Visual Studio 2022


目录

一、介绍

 二、整数类型表

1.分析

2.小结

三、截断

1.什么是截断?

2.为什么需要截断?

示例

3.截断的意义

实际应用

4.如何避免截断?

5.小结

四、共勉


一、介绍

大家好!今天我想跟大家分享一些关于 C 语言整数类型及其数据范围的相关知识,特别是它们的位数和数值范围。这是编程中非常基础但又容易被忽视的部分,了解这些可以帮助我们更好地编写高效可靠的代码。

 二、整数类型表

在 C 语言中,整数类型是我们最常用的类型之一。它们包括了 char, short, int, long, long long 以及它们的无符号版本。每种类型都有其特点和用途,了解它们可以帮助我们在实际编程中做出更好的选择。

首先,让我们通过一张图片来快速了解各种整数类型的位数和数值范围:

  • 注意:对于无符号类型,最小值始终为0,最大值是其位数所能表示的最大整数值。括号内的数值表示的是 C 语言标准的最小要求,实际的实现可能会根据编译器和目标平台有所不同。例如,在大多数现代系统中,int 通常是 32 位,long 在 32 位系统上通常是 32 位,在 64 位系统上通常是 64 位。

在表格中,我们使用了以下符号:

  • N/A 表示不适用,因为无符号类型没有负数的概念。
  •  表示该类型至少需要具备的位数,实际的位数可能会更多。

这个表格提供了关于 C 语言整数类型的详细信息,包括它们的位数和数值范围。请注意,虽然这些是最小要求,实际的实现可能会有所不同。例如,在大多数现代系统中:

  • int 通常是 32 位。
  • long 在 32 位系统上通常是 32 位,在 64 位系统上通常是 64 位。
  • long long 通常是 64 位。

为了确保你的程序能够在不同的平台上正确地工作,建议使用标准定义的宏(如 <limits.h><stdint.h> 中提供的)来获取类型的确切大小和范围。

当然,还有表格版(同上):

数据类型位数最小值(有符号)最大值(有符号)最小值(无符号)最大值(无符号)
char8-128127不适用255*
unsigned char8不适用不适用0255
short≥16-32,76832767不适用65335*
unsigned short≥16不适用不适用065535
int≥16-32,76832767不适用65535*
unsigned int≥16不适用不适用065535
long (32位系统)≥32-2,147,483,6482,147,483,647不适用4,294,967,295*
unsigned long (32位)≥32不适用不适用04,294,967,295
long (64位系统)≥32-9,223,372,036,854,775,8089,223,372,036,854,775,807不适用18,446,744,073,709,551,615*
unsigned long (64位)≥32不适用不适用018,446,744,073,709,551,615

一定注意:对于无符号类型,最小值始终为0,最大值是其位数所能表示的最大整数值。括号内的数值表示的是 C 语言标准的最小要求,实际的实现可能会根据编译器和目标平台有所不同。

1.分析

char 和 unsigned char

  • char:通常为 8 位,可以存储从 -128 到 127 的值。它非常适合存储文本字符。
  • unsigned char:同样为 8 位,但只能存储从 0 到 255 的值。它适合存储不需要负数的情况,例如图像像素值。

short 和 unsigned short

  • short:至少 16 位,可以存储从 -32,768 到 32,767 的值。它适用于存储较小的整数。
  • unsigned short:同样至少 16 位,可以存储从 0 到 65,535 的值。它适合存储不需要负数的较小整数。

int 和 unsigned int

  • int:至少 16 位,但通常为 32 位,在大多数现代系统中。它可以存储从 -32,768 到 32,767 或者更大范围的值。
  • unsigned int:同样至少 16 位,但通常为 32 位,在大多数现代系统中。它可以存储从 0 到 65,535 或者更大范围的值。

long 和 unsigned long

  • long:至少 32 位,但在 32 位系统上通常是 32 位,在 64 位系统上通常是 64 位。它可以存储从 -2,147,483,648 到 2,147,483,647 或者更大范围的值。
  • unsigned long:同样至少 32 位,但在 32 位系统上通常是 32 位,在 64 位系统上通常是 64 位。它可以存储从 0 到 4,294,967,295 或者更大范围的值。

long long 和 unsigned long long

  • long long:至少 64 位,在大多数系统上也是 64 位。它可以存储从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 的值。
  • unsigned long long:同样至少 64 位,在大多数系统上也是 64 位。它可以存储从 0 到 18,446,744,073,709,551,615 的值。

2.小结

了解这些类型的特点和限制对于编写高效的代码非常重要。记住,实际的位数可能会根据编译器和目标平台有所不同。为了确保程序的可移植性和可靠性,请考虑使用 <limits.h><stdint.h> 中的宏来获取确切的类型大小和范围。

三、截断

上面,我们介绍了 C 语言中不同整数类型的位数和数值范围。现在,我们将深入了解一个重要的概念 —— 截断(Truncation),它发生在当我们试图将一个值存储到一个不能完全容纳它的数据类型中时。了解截断现象对于避免潜在的错误和提高代码质量至关重要。

1.什么是截断?

在 C 语言中,截断是指当一个较大的数值被赋给一个较小的数据类型时,超出该类型表示范围的部分被丢弃的过程。例如,如果我们试图将一个大于 255 的数值赋给一个 unsigned char 类型的变量,那么超出 8 位的部分将被截掉。

2.为什么需要截断?

截断主要是由于数据类型的位数限制。每种整数类型都有固定的位数,这决定了它可以表示的数值范围。当一个数值超过了该类型的最大表示能力时,就必须通过截断来适应存储限制。

示例

假设我们有一个 unsigned char 类型的变量 a,它只能存储从 0 到 255 的值。现在我们尝试将一个更大的值,比如说 300,赋给 a。由于 unsigned char 只能存储 8 位,即最多 255,那么 300 的二进制表示为 100101100,但是 unsigned char 只能存储最后 8 位,也就是 00101100,这相当于十进制中的 44。

3.截断的意义

了解截断现象的意义在于避免因类型不匹配而导致的意外行为。截断可能会导致数据丢失或产生未预期的结果。例如,如果一个计算结果需要精确到某个数值范围之外,但最终被存储到一个较小的数据类型中,那么可能会导致错误的输出。

实际应用

让我们通过一个简单的例子来说明这一点。假设我们有一个 unsigned char 类型的变量 c 和两个 unsigned char 类型的变量 ab,分别初始化为 200 和 100。

#include <stdio.h>int main() {unsigned char a = 200; // 二进制 11001000unsigned char b = 100; // 二进制 01100100unsigned char c = 0;c = a + b; // 尝试将 300 存储到 c 中printf("a + b = %d, c = %d\n", a + b, c);return 0;
}

在这个例子中,a + b 的结果是 300,但是在将 300 赋给 c 时发生了截断。300 的二进制表示为 100101100,而 c 只能存储 8 位,因此只保留了最后 8 位 00101100,这等于十进制中的 44。因此,输出将是:

a + b = 300, c = 44

4.如何避免截断?

为了避免截断导致的问题,你可以采取以下几种策略:

  1. 使用适当的数据类型:确保你选择的数据类型能够容纳你需要存储的数值范围。
  2. 类型转换:在赋值之前显式地转换类型,例如使用 (int) 或 (long) 等。
  3. 检查溢出:在执行可能导致溢出的操作之前进行检查,以确保不会发生截断。
示例代码:
#include <stdio.h>
#include <stdint.h>int main() {uint8_t a = 200;uint8_t b = 100;uint16_t sum;// 使用一个更大的类型来避免截断sum = (uint16_t)a + (uint16_t)b;printf("Sum of a and b (no truncation): %u\n", sum);return 0;
}
//在这个例子中,我们使用 uint16_t 类型来存储 a 和 b 的和,
//这样即使结果超过了 unsigned char 的表示范围,也不会发生截断。

5.小结

截断是 C 语言中一个常见的现象,特别是在处理不同类型之间的赋值时。了解截断的概念、原因以及如何避免它,可以帮助我们编写更可靠、更安全的代码。希望这篇文章对你有所帮助!

四、共勉 

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

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

相关文章

为什么要做边界值测试?

边界值测试的理解 边界值测试&#xff08;Boundary Value Testing&#xff09;是一种常用的软件测试方法&#xff0c;它侧重于测试输入值的边缘或临界条件。这些边缘条件通常包括最小值、最大值以及接近这些最小值和最大值的值。边界值测试的基本思想是&#xff0c;许多软件错…

WEB前端开发中如何实现大文件上传?

大文件上传是个非常普遍的场景&#xff0c;在面试中也会经常被问到&#xff0c;大文件上传的实现思路和流程。在日常开发中&#xff0c;无论是云存储、视频分享平台还是企业级应用&#xff0c;大文件上传都是用户与服务器之间交互的重要环节。随着现代网络应用的日益复杂化&…

贪心算法-买卖股票问题

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。贪心算法并不保证总是能得到全局最优解&#xff0c;但它通常能得到不错的解…

【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析

前言&#xff1a; 接上篇&#xff0c;排序算法除了选择排序&#xff08;希尔排序&#xff09;和插入排序&#xff08;堆排序&#xff09;之外&#xff0c;还用交换排序&#xff08;冒泡排序、快速排序&#xff09;和归并排序已经非比较排序&#xff0c;本篇来深层解析这些排序算…

Java 基础 and 进阶面试知识点(超详细)

一个 Java 文件中是否可以存在多个类&#xff08;修饰类除外&#xff09;&#xff1f; 一个 Java 文件中是可以存在多个类的&#xff0c;但是一个 Java 文件中只能存在一个 public 所修饰的类&#xff0c;而且这个 Java 文件的文件名还必须和 public 所修饰类的类名保持一致&a…

轻松入门Linux—CentOS,直接拿捏 —/— <1>

一、什么是Linux Linux是一个开源的操作系统&#xff0c;目前是市面上占有率极高的服务器操作系统&#xff0c;目前其分支有很多。是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统 Linux能运行主要的UNIX工具软件、应用程序和网络协议 Linux支持 32…

C++入门基础:C++中的循环语句

循环语句是编程语言中用来重复执行一段代码直到满足特定条件的一种控制结构。它们对于处理需要重复任务的场景非常有用&#xff0c;比如遍历数组、累加数值、重复执行某项操作直到满足条件等。 但是在使用循环语句的时候需要注意下哈&#xff0c;有时候一不小心会构成死循环或者…

centos安装kubernetes

本章程安装k8s 1.30版本为例。 1、环境配置 k8s 自1.24版本起&#xff0c;移除了dockershim了&#xff0c;1.30使用了containerd运行部署&#xff0c;containerd部署文档参考centos安装containerd-CSDN博客 k8s部署环境可参考容器运行时 | Kubernetes 1.1、修改主机名称 #…

【Django5】模型定义与使用

系列文章目录 第一章 Django使用的基础知识 第二章 setting.py文件的配置 第三章 路由的定义与使用 第四章 视图的定义与使用 第五章 二进制文件下载响应 第六章 Http请求&HttpRequest请求类 第七章 会话管理&#xff08;Cookies&Session&#xff09; 第八章 文件上传…

MacOS 使用DBeaver连接MySQL数据库 以及常见的问题

文章目录 1 DBeaver介绍2 下载安装3 连接MySQL4 DBeaver使用中的常见问题1 DBeaver驱动无法下载2 连接mysql时报错 Public Key Retrieval is not allowed3 mysql出现错误提示&#xff1a;connection refused: Communications link failure The last packet sent successfully t…

【JavaScript】详解Day.js:轻量级日期处理库的全面指南

文章目录 一、Day.js简介1. 什么是Day.js&#xff1f;2. 安装Day.js 二、Day.js的基本用法1. 创建日期对象2. 格式化日期3. 解析日期字符串4. 操作日期5. 比较日期 三、Day.js的高级功能1. 插件机制2. 国际化支持 四、实际应用案例1. 事件倒计时2. 日历应用 在JavaScript开发中…

界面控件Telerik UI for WPF 2024 Q2亮点 - 全新的AIPrompt组件

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

vite tsx项目的element plus集成 - 按需引入踩坑

前面我们进行了开源组件的自研&#xff0c;很多组件可直接用现成的开源组件库&#xff0c;并不需要自己重复造轮子&#xff0c;为此我们讲如何在当前vite vitepress tsx技术整合的项目中实现element plus组件的按需引入&#xff0c;同时解决遇到的一些坑。 安装Element Plus…

Codeforces Round #956 (Div. 2) and ByteRace 2024

A.思维&#xff1a;https://codeforces.com/contest/1983/problem/A AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int t; int n; int main(){cin>>t;while(t--){cin>>n;for(int i1;i<n;i) cout<<i<<" ";cout…

《浅谈如何培养树立正确的人工智能伦理观念》

目录 摘要&#xff1a; 一、引言 二、《机械公敌》的情节与主题概述 三、人工智能伦理与法律问题分析 1.伦理挑战 2.法律问题 四、培养正确的人工智能伦理观念的重要性 五、培养正确的人工智能伦理观念的途径与方法 1.加强教育与宣传 2.制定明确的伦理准则和规范 3.…

Doris全方位教程+应用实例

Impala性能稍领先于presto,但是presto在数据源支持上非常丰富&#xff0c;包括hive、图数据库、传统关系型数据库、Redis等 缺点&#xff1a;这两种对hbase支持的都不好&#xff0c;presto 不支持&#xff0c;但是对hdfs、hive兼容性很好&#xff0c;其实这也是顺理成章的&…

Swift学习入门,新手小白看过来

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

java-数据结构与算法-02-数据结构-06-双端队列

1. 概述 双端队列、队列、栈对比 注1&#xff1a; Java 中 LinkedList 即为典型双端队列实现&#xff0c;不过它同时实现了 Queue 接口&#xff0c;也提供了栈的 push pop 等方法 注2&#xff1a; 不同语言&#xff0c;操作双端队列的方法命名有所不同&#xff0c;参见下表 接…

day05 Router、vuex、axios

配置 router和vuex需要在创建vue项目的时候&#xff0c;开始的时候选择Manually select features&#xff0c;于是就可以在下一个创建配置讯问中选择router和vuex。 axios则需要执行命令行&#xff1a; npm install axios -S 之后再在需要发送请求的view导入即可。 router…

Chapter 20 Python包

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、自定义包1. 什么是Python包&#xff1f;2. 目录结构3. 导入方式4. __all__变量 二、第三方包1. 什么是第三方包&#xff1f;2. 安装第三方包 前言 在 Python 中&am…