IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言:整型在内存中的存储及表示形式(附习题) -> 正文阅读

[C++知识库]C语言:整型在内存中的存储及表示形式(附习题)

我们都知道:一个变量的创建是要在内存中开辟空间的,而空间的大小是根据不同的类型而决定的。

那么数据在开辟空间中是如何存储的呢

首先我们先了解以下概念:

一、整数的表示形式(原码、反码、补码)

计算机中的整数有三种表示方法,即原码、反码和补码

三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”

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

2、而负整数的三种表示方法不同:

  • ? ? ? 原码:直接将二进制按照正负数的形式翻译成二进制
  • ? ? ? 反码:将原码的符号位不变,其他位依次按位取反
  • ? ? ? 补码:反码+1

【注意】

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

我们首先看到一个数比如int a=1 ,那么我们此时写出的二进制是原码,对数以二进制计算时,把原码转换为补码再用补码来计算,而我们打印出来的却是原码。

二、整数的存储(大端存储以及小端存储)

当整数大于1个字节,那么在内存中存储有一个顺序的问题。

那么整数在内存中如何存储呢?

这里我们看一个例子:

#include <stdio.h>
int main()
{
	int a = 0x11223344;  //1个16进制=四个二进制(4个bit位)
	short b = 0x5566;
	return 0;
}

进行调试,发现在内存中:

发现a的地址是这样存储的

b的地址是这样存储的

我们发现,是以1个字节为单位存储

这里我们就有疑问了,为什么要这么存储呢?

其实我们在内存中的存储是分大端存储小端存储

1、大端存储

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

2、小端存储

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

那么我们怎么判断一个数是以小端存储还是大端存储呢?

#include <stdio.h>

int main()
{

	int a = 1;
	char *p = (char *)&a;  //(强制类型转换)
	if (*p == 1)
	{
		printf("小端\n");

	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

或者

#include <stdio.h>

int check_sys()
{
	int a = 1;
	return *(char*)&a;
}

int main()
{
	int ret = check_sys();
	if (1 == ret)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

三、练习

接下来我们通过练习,来深入理解。

1、

#include <stdio.h>

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;
}

2、

#include <stdio.h>

int main()
{
	char a = -128;
	printf("%u\n", a);
	return 0;
}

3、

#include <stdio.h>

int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
}

我们按照补码的形式进行运算,最后格式化成为有符号整数

4、

#include <stdio.h>

int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
	}
	return 0;
}

这道题的结果是:死循环

i从9开始一直减,直到i=-1。

我们知道i在内存中以补码11111111111111111111111111111111存储,如果以无符号数打印,所有位都为有效位,那么结果将很大,所以会一直循环下去。

【注意】无符号数永远不可能小于0.

5、

#include <stdio.h>

int main()
{
	char a[1000];
	int i;
	for (i = 0; i<1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	return 0;
}

6、

#include <stdio.h>

unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}
	return 0;
}

这里的i是无符号位的char ,那么最大的是11111111,为255,所以无符号的char的范围是0-255,因为范围最大为255,那么恒小于255,所以是死循环。

以上就是整型在内存中的存储及表示形式啦!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:14:33  更:2021-08-10 13:14:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 2:31:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码