C语言的数据类型大全,整型数据在内存中的存储方式

2023-11-15

       一.数据类型

         通过长时间的学习C语言以及代码的编写,我掌握了很多很多的数据类型,下面就给大家罗列一下。

        1.内置数据类型

        char        //字符数据类型——                               所占内存空间1字节

        short       //短整型——                                          所占内存空间2字节

         int         //整形——                                               所占内存空间4字节

         long        //长整型——                                          所占内存空间4/8字节

         long long   //更长的整形——                                所占内存空间8字节

         float       //单精度浮点数——                                所占内存空间4字节

        double      //双精度浮点数——                              所占内存空间8字节

        这些内置类型常用于变量与数组的创建与初始化,,操作系统都会根据不同的类型在内存中开辟不同大小的空间。当然,不同的操作系统,各种类型的长度都有着细微的差别,X86与X64便是32位与64位操作系统的不同。

        

        3.自定义类型(也称构造类型)

        > 数组类型      arr[ ]

        > 结构体类型  struct

        > 枚举类型     enum

        > 联合类型     union

        以上这四个类型都是元素的集合,但各有不同,我只会简单做一个区分,具体的内容会在后面的学习中专门出一期自定义类型的博客。

        结构体类型是将某个事物的共有属性集合在一起,声明一个结构体类型来描述该事物。例如学生的身高,年龄,姓名,爱好..等信息放在一起,好比一份简历一般。

        数组类型是将同一种类型的元素放在一起,当作集合展现出来。

        #define命令虽然能解决问题,但也带来了不小的副作用,导致宏名过多,代码松散,看起来总有点不舒服。C语言提供了一种枚举类型,能够列出所有可能的取值,并给它们取一个名字。比如一周的7天,多种多样的颜色等一一列举出来。 

        联合(共用体)类型:共用体的特点是各个成员共用一块内存空间。

        4.指针类型

        int *pi;                //整型指针

        char *pc;            //字符型指针      

        float* pf;             //浮点型指针

        void* pv;            //任意类型指针

        需要注意最后一种指针类型,void,在函数中我们经常可以看到函数使用void,它的作用是让函数不用返回值。但这里的void实际上代表任意类型,它不属于任何固定的类型,也可以成为任何类型(你们可以理解为泛型,不挑食的那种~)。 

        


        二.整型数据在内存中的存储方式

        1.整型数据家族

  • char(char的本质是ASCII码值,所以也归到整型家族中)

  • unsigned char
  • signed char
  • short

  • unsigned short [int]
  • signed short [int]
  • int

  • unsigned int
  • signed int
  • long

  • unsigned long [int]
  • signed long [int]

       long long

  • unsigned long long [int]
  • signed long long [int]

        这里我们需要了解一个知识点,signed 与unsigned型。一个是有符号型,一个是无符号型。有符号型表明此种类型的所有数据都会有正负数;而无符号数表明此种类型的数据是不分正负的,一律按正数处理 。而在C语言中大多编译器会将char,short,int,long型数据都定义为signed有符号型数据,所以char==signed char。通过这我们便可以得出有符号与无符号整型数据的具体范围如下。

(signed)char型数据: -2^7 ~ (2^7)-1      

-128 127
 

  (signed)short型数据:-2^15 ~ (2^15)-1 

-32768 32767

(signed)int型数据:-2^31 ~ (2^31)-1 

-2 147 483 648 2 147 483 647

(signed)long型数据:-2^31 ~ (2^31)-1 

-2 147 483 648 2 147 483 647


(unsigned)char型数据: 0~ (2^8)-1 

unsigned char 0 255

 (unsigned)char型数据: 0~ (2^16)-1  

unsigned short 0 65535

(unsigned)int型数据:0 ~ (2^32)-1 

unsigned 0 4 294 967 295

(unsigned)long型数据:0 ~ (2^32)-1 

unsigned long 0 4 294 967 295

2. 原码、反码、补码

        计算机中的整数有三种2进制表示方法,即原码、反码和补码。 三种表示方法均有符号位和数值位两部分,共有32位数字,最左边第一位是符号位,符号位都是用0表示“正”,用1表示“负”。

  •         数值位正数的原、反、补码都相同。
  •          负整数的三种表示方法各不相同。

        原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。

        反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。 

        补码: 反码+1就得到补码。

        而在计算机的内存中,到底存的是哪种形式的二进制码值呢?接下来然我举个例子大家就知道了。

        代码讲解:

        通过上图代码,我们可以知道a与b值的相减是:1-1=0 ,这是十进制的减法,但计算机中并没有减法器,它只有加法器,且计算机采用的是二进制的计算,所以计算机的计算方式为:1的二进制形式+(-1)的二进制方式,那么我们可以通过计算1与-1的原码,反码,补码相加后得出计算机的计算方式。

1的原码:00000000 00000000 00000000 00000001

-1的原码: 10000000 00000000 00000000 00000001

        通过相加得:10000000 00000000 00000000 00000010——值为-2,所以可以得出计算机并非用原码作为计算方式。


1的反码:01111111 11111111 11111111 11111110

-1的反码: 11111111  11111111 11111111 11111110

        通过相加得:01111111 11111111 11111111 11111100——值很大,所以可以得出计算机也并非用反码作为计算方式。


1的反码:01111111 11111111 11111111 11111111

-1的反码: 11111111  11111111 11111111 11111111

        通过相加得:00000000 00000000 00000000 00000000,因为最高位为0,所以是正数,正数原反补码相同,所以直接输出转换十进制符合条件,值为0,所以我们可以得出计算机采用的是补码作为计算方式。

总结:对于整形来说:数据存放内存中其实存放的是补码。 

3.大小端字节序存储模式 

 什么大端小端?

        大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。

        小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

举个例子:int a=20;//将20赋值给变量a  

        计算机通过赋给变量的值来确定它在内存中的存储位置!

        20转换为二进制序列为:0000 0000 0000 0000 0000 0000 0001 0100(补码)

由于二进制数字过多,采用十六进制简化(十六进制的简化:是将32bit位二进制数从右向左,每四位二进制数归为一个十六进制数。)后:0x 00 00 00 14(这便是变量a在内存中的存储地址。

        但在VS编译编译器却是以0x14 00 00 00的逆序形式展现出来,通过上面的知识点那么我们可以说明一件事:VS编译器是采用小端模式进行存储数据的。

         我们也可以采用函数来进行判断变量在内存中的存储方式,如下图:

//判断编译器使用的是什么字节序存储模式

int main() {
	int a = 1;//将1转换为二进制序列,再简化成十六进制数时为0x 00 00 00 01
	//小端存储则是0x 01 00 00 00        大端存储则是0x 00 00 00 01
	//所以可以使用强制转换为char*,让其指针只访问到十六进制的第一个字节,
	// 若第一个字节为1(01)则表明是小端
	//若第一个字节为0(00),则表明为大端。
	if (*((char*)&a) == 1) {
		printf("小端存储模式\n");
	}
	 if (*((char*)&a) == 0) {
		 printf("大端存储模式\n");
	}
	return 0;
}

        这时候大家就会想大小端字节序的存储到底有什么用?

        这是因为在计算机系统中,我们是以字节为单位的,每个地址单元 都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short 型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32 位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

        大多编译器比如ARM,DSP都是采用小端存储,也不排除有使用大端字节序存储的比如: KEIL C51 则 为大端模式。


        让我们来做两道道练习题.

int main() {
	int i = -20;
	unsigned  int  j = 10;
	printf("%d\n", i + j);
	//按照补码的形式进行运算,最后格式化成为有符号整数
	return 0;
}

        讲解:这是要求两数相加的十进制表现形式。通过心算可知结果为-10.那么我们就先把两个数的补码求出。

i=-20的原反补码如下:

10000000 00000000 00000000 00010100        (-20原码)

11111111   11111111   11111111   11101011        (-20反码)

11111111   11111111   11111111   11101100        (-20补码) 

j=10,为正数,其原反补码相同 

00000000 00000000 00000000 00001010      (10的补码)

i+j 

11111111   11111111   11111111   11101100        (-20补码)                 +

00000000 00000000 00000000 00001010      (10的补码)


(11111111   11111111   11111111   11110110)i+j补码

         求%d有符号十进制数,因为无符号型数+有符号型数=无符号型数字,无符号型数字展现出有符号型的十进制数字,需要看二进制序列的最高位,为1(负数),所以需要转换为原码输出。

(11111111    11111111  11111111   11110110)——> 

(11111111    11111111  11111111   11110101)

(10000000   00000000 00000000  00001010)i+j的原码——>转换为十进制数为-10.

最后来一道题:

#include<stdio.h>
#include<string.h>
int main()
{
    if(strlen("abc")-strlen("abcdef")>0){

    printf("是正数\n");
        }
    else{
    printf("是负数");
    }
    return 0;
}

        这道题设计到无符号整数的知识点。先来看strlen("abc")它的大小为3(strlen遇到字符串的'\0'会自动停止计算),strlen("abcdef")它的大小为6,一般情况下3-6=-3<0,应当输出“ 是负数 ”。

        但结果却相反,输出的“ 是负数 ”。原因在于strlen的返回值是size_t类型值,size_t是无符号型整数(unsigned),所以3-6=-3,-3在无符号型数中是一个很大的正值 。一个无符号型整数值减去一个无符号型整数值,得出的结果仍然是一个无符号型整数值,而无符号型整数值永远都是大于等于0的,所以结果输出“是正数”。

-3转换为二进制序列时:10000000 00000000 00000000 00000011(原码)

                                       11111111 11111111 11111111 11111100(反码)

                                       11111111 11111111 11111111 11111101(补码)

系统认为这个二进制补码值是无符号型,无符号型不分正负(永为正),所以原反补相同,直接转换成十进制输出,通过计算器转换十进制,结果为42亿多。

                                

        好了,以上就是整数数据在内存中的讲解了,觉得有用的话点个关注吧!!谢谢了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言的数据类型大全,整型数据在内存中的存储方式 的相关文章

  • 折线图横坐标怎么设置_Excel折线图的横坐标如何设置?方法超简单,赶快学起来...

    在我们平时使用Excel表格来进行各种数据的编辑工作时 我们往往会因为某一些实际的需求 需要在表格当中插入一些图表 以此来更加清晰 直观的展现此时表格数据当中的内容 而在Excel表格当中插入折线图 相信这是很多小伙伴都会做的工作 尤其是想
  • TCL变量

    目录 简单变量 数组 相关命令 set unset append和incr 简单变量 一个 TCL 的简单变量包含两个部分 名字和值 名字和值都可以是任意字符串 例如一个名为 1323 7 hdgg 的变量在 TCL 中都是合法的 不过为了
  • SSD,PCI-E,NVMe,M.2分类详解

    SSD PCI E NVMe M 2分类详解 首先说一下目前固态硬盘常用的两个接口 与主板相连的接口形状 SATA3和M 2 1 采用SATA3接口 目前机械硬盘采用的接口方式 的固态硬盘 在传输方式上与SATA3 的机械硬盘一样 速度的提

随机推荐

  • 如何使用Pandas的ExcelWriter进行excel操作

    pandas ExcelWriter定制格式 定制表头 渲染颜色等 非ExcelWriter标准的创建模式 ExcelWriter这个插件有个坑 就是已经设置好的格式是无法更改的 因此 由pandas转成excel的时候 必须将格式清除 尤
  • scanf语句的使用和执行原理

    scanf语句的使用和执行原理 1 如何使用scanf 2 scanf语句的原理 1 如何使用scanf d说明我们现在要读入一个整数了 scanf这个函数会读入一个整数 读到的结果赋值给指定变量 要注意指定变量前面的 scanf d pr
  • VUE中使用高德地图(原生UI,信息窗体内部事件监听)

    VUE中使用高德地图 原生UI 先吐槽一下 本人的环境是基于vue3 0的项目 上一位参与项目的同事使用的事vue amap 因工作需要 另外一位同事去了别的项目 所以这个万恶的项目由本人自己维护 就是再本周新增了需求 根据不用大区的用户进
  • ruoyi若依mybatis升级为mybatis-plus

    一 添加mybatis plus依赖 删除mybatis依赖 根目录下的pom文件 更改前
  • 高可用性H.A.(High Availability)

    高可用性 H A High Availability 指的是通过尽量缩短因日常维护操作 计划 和突发的系统崩溃 非计划 所导致的停机时间 以提高系统和应用的可用性
  • html / css 基础面试题 --- 页面导入时,使用link与@import有什么区别?

    页面导入时 使用link与 import有什么区别 标签和 import指令都可以用于在HTML文档中导入CSS样式表 尽管它们都可以实现相同的目的 但它们之间还是存在一些差异 1 加载顺序 当浏览器解析到标签时 会立即下载并应用样式表 这
  • Sigmoid函数使用教程

    Sigmoid函数是一种常用的激活函数 它将输入值映射到一个范围在0到1之间的连续输出 Sigmoid函数的公式如下 scss f x 1 1 exp x 以下是使用Sigmoid函数的Python示例代码 pythonCopy code
  • 六、MATLAB入门—文件操作

    文章目录 前言 一 文件的打开与关闭 1 1 文件的打开 1 2 文件的关闭 二 文件的读写操作 2 1 二进制文件的读写操作 2 2 文本文件的读写操作 三 数据文件定位 总结 前言 经过前面一段时间的学习 相信大家已经能较为熟练的在MA
  • Mini AHRS 姿态解算说明

    本文旨在讲解以下内容 1 加速度 2 陀螺仪 3 磁力计 0 序言 一直想写篇文章关于姿态解算原理的 使用尽量通俗的语句说明如何从加速度计和陀螺仪的数据 融合得到载体的姿态角 无奈自己的水平有限 一直搁置 淡泊以明志 宁静以致远 人总是要逼
  • 计算机网络实验报告 静态路由的配置

    实验名称 静态路由的配置 一 实验目的 1 掌握路由器的配置 2 学会配置静态路由 3 实现静态路由的不同网络间的互通 二 实验内容 1 搭建拓扑图 2 网络拓扑节点IP配置 3 静态路由配置实现不同网络的通信 三 实验环境 GNS3是一款
  • 七大排序之归并排序

    文章目录 什么是归并排序 归并排序代码 归并排序相关习题 148 排序链表 剑指 Offer 51 数组中的逆序对 总结 什么是归并排序 归并排序的思想 将原数组不断拆分 一直拆到每个子数组只有一个元素时 第一阶段结束 然后开始 并 将相邻
  • Databend 开源周报第 110 期

    Databend 是一款现代云数仓 专为弹性和高效设计 为您的大规模分析需求保驾护航 自由且开源 即刻体验云服务 https app databend cn What s On In Databend 探索 Databend 本周新进展 遇
  • 踩坑日记(一)

    1 Vue 错误 Uncaught TypeError Object is not a function at eval vue router esm bundler js vue router版本太高了 需降低版本 降为 3 5 3 可参
  • VUE3 之 条件渲染

    目录 1 概述 2 条件渲染 3 综述 4 个人公众号 1 概述 老话说的好 要锻炼逆向思维 人取我弃 人弃我取 言归正传 今天我们来聊聊 VUE3 的条件渲染 2 条件渲染 2 1 v if div div
  • 全手工杂拌面——韩国才有的中华料理 冬至餐桌上的25道家常手工主食

    这是一道韩国特有的中餐 全手工海鲜杂拌面 面条以鸡蛋 面粉和成 不加一滴水 汤则由鸡骨头经过数小时熬制而成的汤底制作而成 从汤到面一律手工打造 彻底抛弃了现成的面条 速食的鸡汤 符合眼下反对快餐食品 提倡有个性及营养均衡的传统美食的慢食文化
  • MySQL-高级处理

    第五章 SQL高级处理 5 1 窗口函数 5 1 1 窗口函数概念及基本的使用方法 窗口函数也称为OLAP函数 OLAP 是 OnLine AnalyticalProcessing 的简称 意思是对数据库数据进行实时分析处理 为了便于理解
  • QT--收发数据代码

    1 pro QT core gui QT serialport QT widgets QT core 2 h ifndef JTLTESTTOOL H define JTLTESTTOOL H include
  • 【半监督学习】2、Soft Teacher

    文章目录 一 背景 二 方法 2 1 End to End Pseudo Labeling Framework 2 2 Soft teacher 2 3 Box Jittering 三 实验 论文 End to End Semi Super
  • python3+robotframework3+selenium3分层设计和截图及注意事项

    再说一下目前的主要环境信息和版本 操作系统 win10 64位 python版本 3 9 0 RIDE版本 v2 0b2 dev1 robotframework seleniumlibrary 3 141 0 selenium 3 141
  • C语言的数据类型大全,整型数据在内存中的存储方式

    一 数据类型 通过长时间的学习C语言以及代码的编写 我掌握了很多很多的数据类型 下面就给大家罗列一下 1 内置数据类型 char 字符数据类型 所占内存空间1字节 short 短整型 所占内存空间2字节 int 整形 所占内存空间4字节