0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言里的整数数据类型

科技绿洲 来源:网络整理 作者:网络整理 2023-11-24 16:09 次阅读

1. 整型数据类型

C语言里面的整数数据类型

类型名称C语言中的关键字注释
字符型char表示一个很小的整数
短整型short表示一个不怎么大的整数
整型int生活中一般的整数都可以表示
长整型long较大的整数
加长整型long long非常大的整数

一个整数而已,为什么会需要定义这么多不同的类型出来呢?

计算机通过晶体管的开关状态来记录数据。它们通常8个编为一组,我们称之为 字节 。而晶体管有开关两种状态,一个字节有8个晶体管,因此一个字节可以拥有2的八次方个不同的状态。让每一种状态对应一个数值,这样一个字节可以表示256个不同数值。

晶体管状态二进制数值十进制数值
关关关关关关关关000000000
关关关关关关关000000011
关关关关关关000000102
关关关关关关开开000000113
10101010170
开开开开开开开开11111111255

要表示更大的数据范围就需要更多晶体管。要知道在发明C语言的年代,计算机存储资源是非常珍贵而稀缺的。如果只想表达0到100以内的数值,那么一个字节就足够了,何必用两个字节来存储?

而如今,即使存储资源已经较为丰富了,但是大部分的强类型语言,都延续了这个传统。它们均提供了丰富的类型以供选用。而程序员在编写代码时,通常能预想到需要使用到的数据范围的大小。这样在处理一个数据时,可以从语言所提供的类型中选用最合适的类型来承载数据。

在C语言标准并未规定这些数据类型的大小范围,具体的实现交由了编译器和平台决定。

2. 用sizeof关键词来测量大小

int一样,sizeof是C语言中的一个关键词。它是英文size of连起来的合成词。翻译成中文就是什么东西的大小的意思。它能够测量C语言各种实体所占用的字节大小。

如果我们想看int所占用的字节大小,可以这样写sizeof(int)。执行后这段代码后,它的测量结果是一个整型。我们可以借助printf函数将测量结果显示在控制台上。我们现在可以假设sizeof返回的结果是int类型的,在printf函数中使用占位符%d。而更准确的用法,应该用%zu

测量int类型所占用的字节大小,并将结果打印在控制台上的代码如下:

printf("%dn", sizeof(int));

sizeof后面既可以跟 类型,也可以跟 变量、常量。

  1. 类型 ,测类型所占用字节的大小。
  2. 变量 ,测变量的类型所占用字节大小。
  3. 常量 ,测常量的类型所占用字节大小。

三种情况的示例代码。

int a; 
printf("sizeof int = %dn", sizeof(int)); // 1.测类型所占用字节的大小 
printf("sizeof a = %dn", sizeof(a)); // 1.测变量的类型所占用字节大小 
printf("sizeof 123 = %dn", sizeof(123)); // 1.测常量的类型所占用字节大小

测试C语言提供的各种整型类型的大小

printf("sizeof char=%dn", sizeof(char));
printf("sizeof short=%dn", sizeof(short)); 
printf("sizeof int=%dn", sizeof(int));
printf("sizeof long=%dn", sizeof(long));
printf("sizeof long long=%dn", sizeof(longlong));

图片结果:char,short,int,long,long long分别占用了1,2,4,4,8个字节。至此,我们已经得知了它们所占字节大小,并且验证了可以表示越大范围的数据类型所占用的字节越多。值得注意的是intlong均占用4个字节。这并未违反C语言标准,C语言标准规定高级别的类型取值范围不得小于低级别的类型,但是它们可以是一致的。

3. 三位二进制表示的数值范围

charshortintlonglong long分别占用了1,2,4,4,8个字节。而每个字节由8个晶体管组成,每个晶体管状态我们称之为位。那么charshortintlonglong long分别占用了8,16,32,32,64位。

太多的位不利于理解原理,暂时把问题简化一下,试试看位数减少到3。然后,分析3位的组 合,它能表示多大范围的数值.

晶体管状态二进制数据十进制数据
关关关0000
关关0011
0102
开开0113
关关1004
1015
开开1106
开开开1117

三位二进制组成的数据类型,可以表达2的3次方也就是8个数值。如果从0开始,那么可以表达从0到7的 数据范围。 得出结论 :如果不考虑负数,那么整型数据类型可以表达的数据范围是 假设,位数为n,则数据范围从【0】开始,到【2的n次方-1】的数值范围。

负数怎么办?我们需要 拿出一个位来作为符号位 。用来表示这个数据是正数还是负数。在IEEE标准中,这个符号位存在于二进制的最高位。用三位二进制来示范这种情况。

晶体管状态二进制数据十进制数据
关关关0000
关关0011
0102
开开0113
开关关100-4
开关101-3
110-2
开开111-1

加上符号之后,现在取值范围变为负4到3了。红色字体的为最高位,最高位为1的表示负数。你可能会觉得有点奇怪,为什么3的二进制是011,而负3却是101呢?如果简单的加一个符号位,为什么不用111呢?那我们看看如图中所示的3与负3相加的运算结果。

图片

会惊奇地发现,用101来表示负3与用011表示的正3相加。结果为1000,但是由于仅有3位二进制来保 存数据,最高位1被丢弃了。结果为000,居然得到了正确的结果0。

4.数值的补码表示法

时钟是一个圆被分成了12个点,让我们假设这个时钟一步只能走一个整点。那么这个时钟只有12种不同的模式,我们把12称之为时钟的模。

现在指针指向了5点,我们要让指针回到0点。一个办法是直接回退5个小时(5-5)。另一个办法是继续往前走7个小时(5+7)。

在第二种办法中,5+7=12,而12刚好为时钟的模,时钟指向12的同时,也正好指向了0。要让指针回到0点,只需要让它加上模与当前的时间的差即可。

因此,指针回退5小时与指针前进7小时是等价的。我们可以用指针前进来代替指针后退。

将这种思想带入到上面讨论的三位二进制当中。三位二进制能表示8中不同的模式,因此它的 模 为8。要让3回到0,我们可以让3减去3,也可以让3加上 模与3的差,即8-3=5。因此,我们可以把-3在三位二进制中用5的二进制101表示。

这种将用加法来等效减法的二进制表示法被称之为补码表示法。

正数的补码就是其二进制本身。而正数对应的负数的补码为:(模 - 正数)的二进制。

0000
0011
0102
负数模减去正数补码0113
-48-4=4100100-4
-38-3=5101101-3
-28-2=6110110-2
-18-1=7111111-1

补码表示法既通过最高位,区别了正数和负数。并且,巧妙地应用了溢出,所得到的计算结果也是正确的。类似于钟表仅需要向前走就可以实现减法,计算机的电路设计中,也只需要设计加法电路。极大地简化了计算机内部电路的复杂程度。

求一个正数对应的负数的补码的第二种办法:

  1. 先写出这个正数的二进制。
  2. 从二进制的右边开始,遇到第一个1之前,全都填0。
  3. 遇到第一个1之后,把1填下来。
  4. 1之后的全部取反。

从右往左:未遇到1填0,遇到1填1,然后全部取反

十进制0-1-2-3-4
整数二进制000001010011100
补码000111110101100

5.各种整型类型的数值范围是多少

类型sizeof大小二进制位数取值范围算式取值范围
char11×8 = 8位-[2的7次方] ~ +[2的七次方 - 1]-128 ~ +127
short22×8 = 16位-[2的15次方] ~ +[2的15次方 - 1]-32,768 ~ +32,767
int44×8 = 32位-[2的31次方] ~ +[2的31次方 - 1]-2,147,483,648 ~ +2,147,483,647
long44×8 = 32位-[2的31次方] ~ +[2的31次方 - 1]-2,147,483,648 ~ +2,147,483,647
long long88×8 = 64位-[2的63次方] ~ +[2的63次方 - 1]-9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807

次方数比位数少一,是因为最高位被用去做符号位了。

6. 无符号整型

如果你确定你不会用到负数,那么请使用unsigned关键词。表明这个数据类型,是不带有符号位的。既然不带有符号位了,那么原本留给符号位的那一个二进制位,可以用来表示数值。

类型sizeof大小二进制位数取值访问算式取值范围
unsigned char11×8 = 8位0 ~ +[2的8次方 - 1]0 ~ +255
unsigned short22×8 = 16位0 ~ +[2的16次方 - 1]0 ~ +65,535
unsigned int44×8 = 32位0 ~ +[2的32次方 - 1]0 ~ +4,294,967,295
unsigned long44×8 = 32位0 ~ +[2的32次方 - 1]0 ~ +4,294,967,295
unsigned long long88×8 = 64位0 ~ +[2的64次方 - 1]0 ~ +18,446,744,073,709,551,615
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4257

    浏览量

    85647
  • 晶体管
    +关注

    关注

    77

    文章

    9629

    浏览量

    137809
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136120
  • 数据类型
    +关注

    关注

    0

    文章

    236

    浏览量

    13607
  • 整数
    +关注

    关注

    0

    文章

    13

    浏览量

    6497
收藏 人收藏

    评论

    相关推荐

    C语言中的基本数据类型

    C语言是非常重要的一门程序设计语言,学好C语言再去学习其他编程语言将变得很轻松,因为大部分
    发表于 04-26 17:33 1969次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中的基本<b class='flag-5'>数据类型</b>

    C语言中基本数据类型、变量和常量的使用

    C语言中基本数据类型、变量和常量的使用
    发表于 08-18 16:42 2510次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中基本<b class='flag-5'>数据类型</b>、变量和常量的使用

    技术干货驿站 ▏深入理解C语言:基本数据类型和变量

    C语言中,数据类型和变量是编程的基础,也是理解更复杂概念的关键。数据类型决定了变量的内存分配、存储范围和操作方式,而变量则是存储数据的容器
    的头像 发表于 07-26 17:53 1915次阅读
    技术干货驿站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:基本<b class='flag-5'>数据类型</b>和变量

    Python中常用的数据类型

    数据类型是每种编程语言必备属性,只有给数据赋予明确的数据类型,计算机才能对数据进行处理运算,因此,正确使用
    发表于 04-19 15:14

    FPGA中的VHDL语言数据类型和运算符

    VHDL 和其他高级语言一样,具有多种数据类型。对大多数数据类型的定义两者是一致的(例如整数型),但是也有一些数据类型是 VHDL 所独有的
    发表于 09-10 10:09

    C语言数据类型有哪些?

    C语言数据类型(基础类型+结构体)
    发表于 12-25 07:06

    C预处理与C语言基本数据类型

    指令表:注意:宏名的书写由标识符与两边各两条下划线构成。C语言基本数据类型不同操作系统中数据类型所占字节数图解数据类型的其他分类:变量常量(
    发表于 12-21 08:29

    浅析System Verilog中的整数数据类型

    ,从此大一统。另外,追随潮流。SystemVerilog还支持了面向对象的特性,以支撑功能验证环境的模块化和可重用需求。Integer Data Types整数数据类型可以不同维度进行划分
    发表于 10-11 14:15

    C程序的运行环境和C语言数据类型

    ⒈ 实验目的⑴ 了解在具体的语言环境下如何编辑、编译、连接和运行一个C程序。⑵ 通过运行简单的C程序,初步了解C源程序的特点。⑶ 掌握C
    发表于 06-21 09:36 55次下载

    C语言数据储存与数据类型类型转换的详细资料说明

    程序说到底就是对数据的处理,所以首先要弄清楚需要处理哪些数据,计算机如何存储这些数据C语言根据需要,抽象出了一些基本
    的头像 发表于 02-24 15:39 3930次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的<b class='flag-5'>数据</b>储存与<b class='flag-5'>数据类型</b>及<b class='flag-5'>类型</b>转换的详细资料说明

    C语言-基本数据类型与位运算

    这篇文章作为基础知识点,总结C语言的基本数据类型有哪些,浮点数的精度,整数变量的空间范围,变量定义语法,变量命名规则,浮点数打印格式,基本数据类型
    的头像 发表于 08-14 09:56 1538次阅读

    C语言数据类型-2

    对于一个计算机程序,它所做的所有运算的本质都是数据的处理。但是数据的样式并不单一,因此就有了各种各样的数据类型。在C语言中,为了处理这些复杂
    的头像 发表于 02-21 14:44 759次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的<b class='flag-5'>数据类型</b>-2

    基本数据类型分享

    基本数据类型 基本数据类型:包括位、位序列、整数、浮点数、日期时间。此外字符也属于基本数据类型,请参见文档String与WString。 1.位和位序列 2.
    的头像 发表于 06-13 14:14 9488次阅读
    基本<b class='flag-5'>数据类型</b>分享

    plc数据类型怎么理解和应用

    的PLC程序的关键。 PLC数据类型的基本理解 PLC数据类型是指用于存储和表示数据的方式,它们可以区分为不同类型数据元素。根据
    的头像 发表于 12-19 11:39 3998次阅读

    C语言数据类型有哪些

    C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
    发表于 03-20 10:56 437次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>数据类型</b>有哪些