建网站公司营销型网站建设,虚拟机做门户网站如何绑定域名,开源门户系统,四川建设厅网站打不开C语言数据存储 — 整型篇 前言1. 数据类型介绍1.1 类型的基本分类 2. 整型在内存中的存储2.1 原码、反码、补码2.1.1 为什么数据存放在内存中存放的是补码 2.2 大小端介绍2.2.1 什么是大小端#xff1f;2.2.2 为什么有大端和小端#xff1f;2.2.3 一道百度系统工程师笔试题 3… C语言数据存储 — 整型篇 前言1. 数据类型介绍1.1 类型的基本分类 2. 整型在内存中的存储2.1 原码、反码、补码2.1.1 为什么数据存放在内存中存放的是补码 2.2 大小端介绍2.2.1 什么是大小端2.2.2 为什么有大端和小端2.2.3 一道百度系统工程师笔试题 3. 结尾 前言
在C语言中了解相关数据存储对一名优秀程序员来说是至关重要的通过相关原理从而更加深入地理解计算机如何存储和操作数据这对于编程人员来说是非常重要的。只有深入理解计算机存储和操作数据的原理才能编写出更加高效、可靠的程序。本文将详细介绍C语言中整型数据是如何存储的希望能帮助读者在编程路上更近一步
1. 数据类型介绍
C语言中基本的内置类型和大小如下 类型的意义
使用这个类型开辟内存空间的大小大小决定了使用范围如何看待内存空间的视角
1.1 类型的基本分类
整型家族 浮点数家族
float
double
(long double)构造类型 数组类型
结构体类型 struct
枚举类型 enum
联合类型 union指针类型
int *pi;
char *pc;
float *pf
void *pv;
……空类型 void 表示空类型无类型 通常应用于函数的返回类型、函数的参数、指针类型。 2. 整型在内存中的存储 一个变量的创建是要在内存上开辟空间的。而空间的大小是根据不同的类型而决定的。 接下来我们将介绍数据在所开辟的内存中是如何存储的 比如
int a 20;
int b -10;我们知道a/b分别分配了4字节的空间那如何存储
在介绍之前我们要先了解以下概念。
2.1 原码、反码、补码 计算机中的整数有三种2进制表示方法即原码、反码和补码。 三种表示方法均有 符号位和 数值位两部分.符号位都是用0表示“正”用1表示“负”。 正数的原码、反码、补码都相等。负整数的三种表示方式各不相等。
负整数的三种表示方法 原码 直接将数值按照正负数的形式翻译成二进制的形式就可以得到原码。 补码 将原码的符号位不变其他位按位取反就得到反码。 补码 反码1就得到补码。 2.1.1 为什么数据存放在内存中存放的是补码 在计算机系统中数值一律用补码来表示和存储。原因在于使用补码可以将符号位和数值位统一处理 同时加法和减法也可以统一处理CPU只有加法器此外补码和原码相互转换其运算过程是相同的不需要额外的硬件电路。 例子
在计算机中数值一律用补码来表示和存储。原因在于是用补码可以将符号位和数值位统一处理
例如结算1 (-1)使用原码计算
00000000 00000000 00000000 00000001 -- 1的原码
10000000 00000000 00000000 00000001 -- -1的原码
10000000 00000000 00000000 00000020 -- 结果-2
原码计算错误使用补码计算00000000 00000000 00000000 00000001 -- 1的补码11111111 11111111 11111111 11111111 -- -1的补码
100000000 00000000 00000000 00000000 --结果0
补码计算正确Tips
补码和原码相互转化运算过程是相同的。即原码符号位不变其他位按位取反的到反码反码1得到补码。而由补码反推原码时除了将上述过程力推还可以补码符号位不变其他位按位取反后在1即可得到原码。
我们再来看看内存中的存储以vs为例 我们可以看到对于a存放在内存中的补码我们发现顺序有点不对劲 这是为什么呢 这就不得不提到大小端了。
2.2 大小端介绍
2.2.1 什么是大小端 大端存储模式又称大端字节序存储数据的低位字节中的数据存放在高地址处高位字节中的数据存放在低地址处。 小端存储模式又称小端字节序存储数据的低位字节中的数据存放在低地址处高位字节中的数据存放在高地址处。 Tips
字节序以字节为单位讨论内存的存储顺序。
2.2.2 为什么有大端和小端 为什么会有大小端模式之分呢 这是因为在计算机系统中我们是以字节为单位的每一个地址单元对应一个字节一字节为8bit.但是在C语言中除了8bit的char之外还有16bit的short型32bit的long型(具体要看编译器)等。另外对于位数大于8位的处理器例如16位或32位的处理器 由于寄存器宽度大于一个字节那么必然存在着一个如何将多个字节安排的问1题。因此就导致了大端存储模式和小端存储模式 例如 一个16bit的short型x, 在内存中的地址为0x0010x的值为0x1122。那么0x11为高字节0x22为低字节。 对于大端模式就将0x11放在高地址处即0x0011中而0x22放在低地址中即0x0011中。小端模式刚好相反。 我们常用的x86和x64结构是小端模式而KEIL C51则是大端模式。很多的ARM, DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
2.2.3 一道百度系统工程师笔试题 请简要介绍大端字节序和小端字节序的概念设计一个小程序来判断当前机器的字节序。10分 相关概念读者自行查看2.2.1。
下面来分析如何设计小程序来判断数据存储模式。 如下图所示我们可以用数字1即可解决问题。 我们发现如果是小端模式第一个字节中存放的数据为1如果是大端模式第一个字节中存放的数据为0。 接下来问题转化为如何让编译器只访问一个字节空间呢 其实很简单我们只需要将a的指针强制类型转换为char*在解引用访问即可。 代码实现
//代码1
判断当前机器的自己序
int check_sys()
{int a 1;char* ret (char*)a;if (*ret 1)return 1;elsereturn 0;
}int main()
{int ret check_sys();if (ret 1)printf(小端\n);elseprintf(大端\n);return 0;
}//代码2简化代码1
int check_sys()
{int a 1;//大端返回0小端返回1return *(char*)a;
}
int main()
{int ret check_sys();if (ret 1)printf(小端\n);elseprintf(大端\n);return 0;
}3. 结尾
本篇文章到此就结束了。接下来在C语言数据存储 — 浮点数篇中将详细介绍浮点数相关知识敬请期待。如果对您有帮助记得三连哦感谢您的支持