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

news2024/9/8 23:20:01

🦄个人主页:小米里的大麦-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; // 二进制 11001000
    unsigned char b = 100; // 二进制 01100100
    unsigned 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.coloradmin.cn/o/1957760.html

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

相关文章

【刷题汇总 -- 笨小猴、 主持人调度(一)、分割等和子集】

C日常刷题积累 今日刷题汇总 - day0251、笨小猴1.1、题目1.2、思路1.3、程序实现 2、主持人调度&#xff08;一&#xff09;2.1、题目2.2、思路2.3、程序实现 3、分割等和子集3.1、题目3.2、思路3.3、程序实现 -- 0/1背包问题 4、题目链接 今日刷题汇总 - day025 1、笨小猴 1…

JAW:一款针对客户端JavaScript的图形化安全分析框架

关于JAW JAW是一款针对客户端JavaScript的图形化安全分析框架&#xff0c;该工具基于esprima解析器和EsTree SpiderMonkey Spec实现其功能&#xff0c;广大研究人员可以使用该工具分析Web应用程序和基于JavaScript的客户端程序的安全性。 工具特性 1、动态可扩展的框架&#x…

设计模式7原则

链接&#xff1a;设计模式7原则 (qq.com) 设计模式7原则JAVA代码实现 (qq.com)

2024年7月29日(web nginx)

web 一、web基本概念和常识 Web:为用户提供的一种在互联网上浏览信息的服务,Web服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为用户提供各种互联网服务,这些服务包括信息浏览服务,以及各种交互式服务,包括聊天、购物、学习等等内容。 Web 应用开发也经过了几代技术…

Linux基础复习(五)

前言 本文介绍了Linux常用命令&#xff0c;接Linux基础复习&#xff08;四&#xff09; 一、常用命令 命令通配符 在Linux中&#xff0c;命令通配符&#xff08;也称为通配符模式或通配符表达式&#xff09;是用来匹配文件名或其他字符串的一种特殊字符。这些通配符可以帮助…

leetcode日记(61)矩阵置零

看起来很简单的题目&#xff0c;最简单粗暴的方法是建立两个数组记录需要置零的行和列&#xff0c;但是题目中有一个进阶版要求&#xff1a; 进阶&#xff1a; 一个直观的解决方案是使用 O(mn) 的额外空间&#xff0c;但这并不是一个好的解决方案。一个简单的改进方案是使用 O…

VC14(VC2015)安装失败报错0x80240017

百度网盘链接&#xff1a;https://pan.baidu.com/s/1ybBriAXfxtvLvk7ve2zwIg?pwd1111 提取码&#xff1a;1111 必须按以下顺序安装&#xff1a; clearcompressionflag.exe、KB2919355、KB2932046、KB2959977、KB2937592、KB2938439、KB2934018。 KB2919442 是 Windows 8.1 更…

【根据字符出现频率排序】python刷题记录

R2-字符串算法 包哈希表的呀。 注意 class Solution:def frequencySort(self, s: str) -> str:dictdefaultdict(list)#字符串不能直接排序&#xff0c;需要转换为列表["a","b","c"]slist(s)for str in s:if not dict[str]:dict[str]1else:…

扫码登录方案

以哔哩哔哩扫码登录为例 二维码解码后内容为&#xff1a;https://passport.bilibili.com/h5-app/passport/login/scan?navhide1&qrcode_keye60869ce7f5235c7123175a7effc6f90&frommain-fe-header 扫码登陆&#xff0c;利用已登录设备授权未登录设备登录的方式 扫码…

android settings提示音开关状态与修改(一)

android系统&#xff0c;settings提示音类型&#xff1a; 提示音开关默认状态&#xff0c;定义文件&#xff1a; frameworks/base/packages/SettingsProvider/res/values/defaults.xml 提示音默认定义&#xff1a; // 锁屏提示音 <integer name"def_lockscreen_sounds_…

前端canvas——贝塞尔曲线

曲线之美&#xff0c;不在于曲线本身&#xff0c;而在于用的人。 所以就有了这期贝塞尔曲线。 新规矩&#xff0c;先上个GIT。 效果图 开局一张图&#xff0c;代码全靠编。 代码 画骨 先想着怎么画一个心形吧&#xff0c;等你想好了&#xff0c;就知道怎么画了。 首先就还…

知识图谱增强的RAG(KG-RAG)详细解析

转自&#xff1a;知识图谱科技 这是一个与任务无关的框架&#xff0c;它将知识图谱&#xff08;KG&#xff09;的显性知识与大型语言模型&#xff08;LLM&#xff09;的隐含知识结合起来。这是该工作的arXiv预印本 https://arxiv.org/abs/2311.17330 。 我们在这里利用一个名为…

DP的优化途径---单调队列

1.前缀和单调队列&#xff1a;https://www.acwing.com/problem/content/137/ 我们先预处理下前缀和&#xff0c;以下标为i的点为有边界&#xff1a; 也就是求()的min&#xff0c;考虑到j的范围是定值&#xff0c;用单调队列维护即可。 AC代码&#xff1a; #include<bits/…

家具缓冲器:提升家居体验的得力助手

在家具和工业设备的设计与制造中&#xff0c;钢珠滑轨缓冲器的安装与否一直是一个备受争议的话题。钢珠滑轨缓冲器作为一种能够减少冲击和噪音的装置&#xff0c;其存在具的价值&#xff0c;但也并非在所有情况下是必需的。首先&#xff0c;从功能和使用体验的角度来看&#xf…

【C++题解】1581. 马里奥的银币1

问题&#xff1a;1581. 马里奥的银币1 类型&#xff1a;数组找数 题目描述&#xff1a; 马里奥有很多银币&#xff0c;有一天他得到了一张魔法卡&#xff0c;只要使用这张魔法卡&#xff0c;就可以使得他的银币里面的最大的银币金额变得更大。如果他最大的银币是偶数的金额&a…

【Vue3】watchEffect

【Vue3】watchEffect 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文…

001.精读《Big Data: A Survey》

文章目录 1. 引言2. 精读2.1 摘要2.2 背景2.4 相关技术2.5 相关流程2.6 应用场景 3. 总结 1. 引言 大数据精读周刊首次与大家正式见面。我们每周将精读并分析几篇精选文章&#xff0c;试图讨论并得出结论性观点。我们的目标是通过深入探讨&#xff0c;帮助大家更好地理解大数据…

力扣高频SQL 50题(基础版)第二十五题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十五题619.只出现一次的最大数字题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十五题 619.只出现一次的最大数字 题目说明 MyNumbers 表&#xff1a; ------…

Qt,获取其他.exe文件的标准输出流的信息(printf/print的输出信息)

比如&#xff0c;通过Python编写爬虫软件功能是运行程序获取豆瓣电影排行榜信息&#xff0c;并通过print打印出来。将其打包成.exe,通过Qt来调用&#xff0c;并获取到.exe程序运行的结果 简单示例代码&#xff1a; // 创建 QProcess 对象QProcess process;// 连接信号槽以获取…

java计算器,输入公式和对应变量的值

目标&#xff1a;最近想写个东西&#xff0c;本质就是一个计算器&#xff0c;我们可以输入公式&#xff08;例如&#xff1a;ab&#xff09;&#xff0c;然后把公式的值&#xff08;a:10,b:20&#xff09;也输入进去。最后得到结果。核心&#xff1a;这个想法核心部分就是给一个…