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

【C语言】数据在内存中的存储(一)

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

【C语言】数据在内存中的存储(一)

1、类型的基本分类: 1.1 整形家族:

  >char(一般默认为有符号数)、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)

1.2 浮点数家族:

  >float

  >double

1.3 构造类型:

  >数组类型

  >结构体类型 struct

  >枚举类型 enum

  >联合类型 union

1.4 指针类型

  int* pi

  char* pc

  float* pf

  void* pv(可以放任何数据类型的地址,但无法进行指针运算以及解引用)

1.5 空类型

  void 表示空类型(无类型)

  通常应用于函数的返回类型、函数的参数、指针类型。

2. 整形在内存中的存储 2.1 原码、补码、反码

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

  >内存中存放、整型表达式计算时使用的是补码。

  >打印以及我们看到的是原码。

  >正整数的原码、反码、补码相同。

  >对于负整数:将原码除符号位按位取反得到反码,反码加1得到补码。

2.2 大小端介绍

  大端字节序(存储)模式:数据的低位保存在内存的高地址中,数据的高位保存在低地址中。

  小端字节序(存储)模式:数据的地位保存在内存的低地址中,数据的高位保存在高地址中。

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

#include 
// 判断是大端存储还是小端存储,只需要看1的第一个字节存的是1 还是0
int main()
{
	int a = 1;
	char*p = (char*)&a; //&a 的类型是int* ,强制转换为char*

	if (*p == 1)
		printf("小端n");
	else
		printf("大端n");

	return 0;
}
//写成函数
int check_sys()
{
	int a = 1;
	char* p = (char*)&a;

	if (*p == 1)
		return 1;
	else
		return 0;
}
//简化
int check_sys()
{
	int a = 1;

	if (*(char*)&a == 1)
		return 1;
	else
		return 0;
}

//返回1表示小端
//返回0表示大端
//再简化
int check_sys()
{
	int a = 1;
	return *(char*)&a;
}

int main()
{
	if(check_sys() == 1)
		printf("小端n");
	else
		printf("大端n");

	return 0;
}
  2.3 练习

Q1 以下代码输出结果是什么?

#include
int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);
	return 0;
}
// 运行结果:-1,-1,255
//10000000000000000000000000000001	-1的原码
//11111111111111111111111111111110	-1的反码
//11111111111111111111111111111111  -1的补码
//因为char为一个字节,补码进行截断-->11111111,打印的为%d,要进行整形提升,有符号数高位补符号数,再进行补码与原码的转换得到-1;b同理。
//c为无符号数,在进行整形提升时高位补0,原反补相同-->255

Q2 以下代码输出结果是什么?

//(1)
#include 
//%u 是打印无符号整形,认为内存中存放的补码对应的是一个无符号数
//%d 是打印有符号整形,认为内存中存放的补码对应的是一个有符号数

int main()
{
	char a = -128;
	//
	//10000000000000000000000010000000-原
	//11111111111111111111111101111111-反
	//11111111111111111111111110000000-补
	//截断:10000000 - a
	//整形提升有符号数补符号数:11111111111111111111111110000000
	//打印的为无符号数,原反补同,故得到a的十进制为4294967168
	printf("%un", a);

	return 0;
}
(2)
int main()
{
	char a = 128; //有符号数
	
	//00000000000000000000000010000000-补
	//10000000 - a
	//11111111111111111111111110000000-打印无符号数,原=补,结果也是4294967168
	//
	printf("%un", a);

	return 0;
}

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

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

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