栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据在内存中的存储(1)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据在内存中的存储(1)

 1

数据类型的种类:

 char   1byte

 short 2byte

 int   4,     在16位机器下是2byte,32位与64位是4个byte

 long   (4/8)至于是4byte还是8byte,取决于编译器环境

 long long 8byte(在C99标准下才引入long long),所以一般在新的编译器下才有这个类型

 float  4byte

 dobule 8byte

还有更多的数据类型,如要查找,可在cppreference等网站查看类型

2

整型:

 char(char放入整型是因为每个字符变量的ASCII值是个整数)

{

分为 unsigned char

 (sigend) char

不加unsigned默认为有符号类型(char是unsigned char,还是signed char 取决于编译器,不过大多数编译器为signed char)

}

 short

 unsigned short

  (sigend)  short

   int

  long

打印无符号的数只能用(%u),如果是无符号数用(%d)打印,会当作有符号数打印

为什么会变那么大是因为内存中存的是二进制形式的补码,补码最高位为有符号数,当类型变为无符号,最高位的符号数则会变为无符号运算,后面详细讲解

浮点型类型 (实型)

 float

 double

构造类型(自定义)

数组类型

结构体类型 struct

枚举类型 enum

联合类型 union

指针类型

 char* p;

 int* p;

 void* p;

 float* p;

等 多级指针类型

空类型

 void

常应用于函数返回类型,指针类型,函数类型

原码反码补码

整数的二进制表示形式有三种,原反补码,而内存中存的是二进制的补码

正数的 原码 反码 补码相同

负数的则不同

原码:按照一个数直接写出来的二进制就是原码

如 15 ——>00000000 00000000 00000000 00001111(二进制原码)

最高位为符号位 

符号位为0表示正数,符号位为1表示负数

-15 ——>10000000 00000000 00000000 00001111(二进制原码)

补:因为15为正数,所以它的原码反码补码都相同

反码:符号位不变,其他位按位取反

(-15)10000000 00000000 00000000 00001111(原码)——>

11111111 11111111 11111111 11110000(反码)

补码:反码的二进制序列+1

11111111 11111111 11111111 11110000(反码)——>

11111111 11111111 11111111 11110001(补码)

了解这些,unsigned int,就是把最高位的符号位当作无符号来使用,

当然首先要把内存中的补码转换成反码,再转换成原码来使用。

整数在内存中存补码原因:

1 计算机只能算加法,所以1-1==1+(-1)

如果计算机中用原码算,最高位是符号位,那符号位一个为1一个为0,

那到底是加还是不加呢,这无法判断所以原码首先是不能用于运算了,

如果用补码计算那最高位符号位可以把它挤出去,用补码就可以将符号位与

数值域统一处理

 且补码与原码相互转换,其运算过程是相同的,都是取反+1

4

大端字节序和小端字节序

首先要知道如何查看数据在内存中的存储,第一步按F10进入调试,第二步

 

 数据在内存中以二进制存储,在内存窗口以16进制展现,因为如果编译器以二进制 

展示,数据太大,放不下

 10的16进制原本位 00 00 00 0a,但内存中却以上图的形式展示,

这就与大小端字节序有关了。(这是小端字节序存储)

当一个数值在内存中存储,这个数值所占的大小超过一个字节,那

它在内存中的存储就有顺序了

大端(存储)模式:一个数据的低字节序的内容存放在高地址处,高字节序的内容

存放在低地址处,这种存储方式就是大端字节序存储,如图

 

小端(存储)模式:一个数据低字节序的内容放在低地址处,高字节序的内容存放在高地址处

这种存储方式就是小端字节序存储。

好,概念介绍完,练练题

设计一个程序来判断 当前机器的字节序

思路:通过大小端的存储模式不同,我们可以创建一个简单变量,然后判断这个

变量的第一个字节是否为某一值。为了拿到这个变量的第一个字节内容,我们可以

取地址,然后强制类型转换为(char*),放入char* 的指针并对指针解引用并判断,如图

代码为

int main()
{
	int a = 1;
	char* p = (char*)&a;//强制类型转换拿到第一个字节地址放char*便于解引用
	if (*p == 1)//判断大小端
	{
		printf("小端");
	}
	else
	{
		printf("大端");
	}
	return 0;
}

 如果错误,望斧正,谢谢谢谢

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/655981.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号