c语言数据存储空间长度排序,C语言数据存储结构
我将为假期做笔记
这个月可能会发表十几二十篇
这是内存中目录整形的原始互补转换方法无符号和有符号关键字:有符号整数和无符号整数值范围变量内容存储和取出先有空格,再在内容大小末尾存储浮点数记忆中的存储规则练习
塑造记忆中的存储
原始补充
对于有符号的数字,最高位一般用来表示符号位用0代表“积极”,用1代表“消极”
有符号数在计算机中有三种表达方式,即原码、反码和补码
计算机中的任何数据都必须转换成二进制,因为计算机只知道二进制
如果数据为负值,应遵循以下规则进行换算:
原码:直接把二进制翻译成正负数形式的二进制就行了逆码:通过改变原码的符号位,将其他位依次反相,即可得到补码:补码为1时得到补码正数的原补数是一样的
无符号数:不需要转换或符号位,原补码相同对于整形:数据存储内存中实际存储的是补码
转换方法一:先-1,符号位不变,位反转方法二:重复原码到补码的过程
demoint a=20
//20是正整数
//0000 0000 0000 0000 0000 0000 0001 0100
int b=-10;
//-10是负整数
//1000 0000 0000 0000 0000 0000 0000 1010
//1111 1111 1111 1111 1111 1111 1111 0101
//1111 1111 1111 1111 1111 1111 1111 0110
无符号和有符号关键字
有符号整数和无符号整数有符号int a=-10;
无符号int b=10u//u提醒自己是无符号数,可以加也可以不加
以char为例有符号字符
0000 0000
//最高位是符号位
//表示有7个数字位
1 111 111-127//可以表示[-127,0]
0 111 111-127//可以表示[0,127]
//然后
//1000 0000和0000 0000都可以表示0
//有两个表达式你选择哪一个?为了解决这个问题,用1000 0000来表示-128证明:1 1000 0000 //-128源代码
0111 1111//逆代码
100万//补充
//存储在8位char中的9位char类型将被截断
//最后一笔存款是1000 0000
//取的时候指定1000 0000是-128所以有符号char类型的值是-128~127
同理,无符号数为0~255
* *汇总规则:整数值的范围* *
无符号:[0,2 n-1]有符号:[-2 (n-1),2 (n-1)-1]
一种类型可以表示多少数据取决于多位排列和组合的数量
有符号int b=-10的变量的进入和退出;
无符号整数d=-10;//?
先有空间,再有内容当数据保存在空间中时,数据已经被转换成二进制存储时,数据不关心内容
让我们首先将内容转换成二进制:
-10
补充:1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0110
省省吧读取变量时,类型决定了如何解释存储在空间中的二进制序列
只有当它有数据类型时才有意义!
有符号int b=-10;//-10
无符号整数d=-10;//4294967286结论:
存储:文字数据必须先转换成补码,放入空间所以所谓的符号位,完全取决于数据本身携带的是加号还是减号与变量有无符号无关!获取:在决定是否查看最高符号位之前,必须查看变量的类型如果不需要,直接把二进制转换成十进制如有必要,需要先转换成原码才能识别(当然最高符号位在哪里,需要明确大小端)为什么都是补语?
在计算机系统中,所有的数值都用补码来表示和存储原因是,通过使用补码,可以统一处理符号位和数值域;同时加减法也可以统一处理(CPU只有加法器)另外,补码和原码是相互转换的,运算过程是一样的,不需要额外的硬件电路
大小存储采用十六进制数字0x12 34 56 78根据数据字节的单位,有高低权重位内存中也有高低地址这时12的重量是78如果这个数存储在内存中,应该如何存储?
![[})FCGJ ~]CPO 1 o 3 TQ 2[syk4j . png]]
不管怎么存,只要按同等条件取,都可以
因此产生了两种存储方案:大端和小端
Big-endian:在字节中,低权重位的数据存储在高地址,这称为big-endian小端:以字节为单位,低权重的数据存放在低位地址,称为小端以0x11223344为例:
0xA0
0xA1
0xA2
0xA3
主要方面/特征
11
22
33
四十四
小椴
四十四
33
22
11
无论你怎么保存,都不会影响用户使用!
为什么有大端和小端:
这是因为在计算机系统中,我们以字节为单位,每个地址单位对应一个字节,一个字节就是8 bit但是在C语言中,除了8位字符之外,还有16位字符
短整型,32位长(取决于编译器)另外,对于8位以上的处理器,比如16位或者32位的处理器,因为寄存器宽度大于一个字节,必然存在多个字节如何排列的问题所以导致了大端存储模式和小端存储模式
例如,如果16位短整型X在存储器中的地址为0x0010,X的值为0x1122,则0x11为高字节,0x22为低字节对于大端模式,0x11放在低位地址,即0x0010,0x22放在高位地址,即0x0011小模式,正好相反我们常用的X86架构是小端模式,而KEIL C51是大端模式很多ARM和DSP都是小端模式有些ARM处理器还可以通过硬件选择是大端模式还是小端模式
补充:1
浮点数在内存中存储一段代码:
int n=9;
float * pFloat=(float *)n;
printf( n的值为:%d\n ,n);
printf( * p float 的值为:%f\n ,* p float);
* pFloat=9.0
printf( num的值是:%d\n ,n);
printf( * p float 的值为:%f\n ,* p float);结果:
因此,我们可以推测浮点数和整数在内存中的存储方式是不同的
存储规则根据国际标准IEEE(电气和电子工程协会)754,任何二进制浮点数V都可以用以下形式表示:
(-1) s * m * 2 e (-1) s代表符号位,当s=0时,v为正;当s=1时,v为负m代表大于或等于1且小于2的有效数字2 e表示指数位
举个栗子:
十进制的5.5是二进制的101.12^1 2^0 2^(-1)
相当于1.011 * 2 ^ 2
根据上面V的格式,可以得出s=0,M=1.011,E=2
同样,按照十进制-5.5的格式,我们可以得到s=1,M=1.011,E=2
** IEEE 754规定:**
对于32位浮点数,最高位是符号位S,接下来的8位是指数E,剩下的23位是有效数字m
对于64位浮点数,最高位是符号位S,接下来的11位是指数E,剩下的52位是有效数字m
IEEE 754对有效数M和指数e有一些特殊的规定
前面说过,1≤M ^ 2,也就是M可以写成1xxxxx
x的形式,其中
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。