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++知识库 -> 3分钟带你了解C语言中整形在内存中的存储 -> 正文阅读

[C++知识库]3分钟带你了解C语言中整形在内存中的存储


—————————————————————————

写在前面

我们都知道,一个变量的创建是要开辟一块空间的,空间的大小由数据的类型来决定的。你是否好奇整形在内存中十如何存储的?今天我们就来聊一聊这个问题。

整形家族有哪些?

整形家族包括char(字符型),short(短整形),int(整形),long(长整型)等。其中可以用有符号和无符号来修饰他们。

整形数据的三种表示形式

计算机中的数据有原码,反码和补码三种表示方法。有符号的整形数据分为符号位和数值位,无符号的整形数据只有数值位。符号位是用“1”表示负,“0”表示正。有规定:正数的原反补相同。

原码

将一个数按照规定的正负以二进制形式表示出即可。

例:int a=1; a的原码就是 00000000 00000000 00000000 00000001
int b = -1; b的原码就是 10000000 00000000 00000000 00000001

反码

将原码的符号位不变,其他位按位取反。

例:int a=1; a的反码就是 00000000 00000000 00000000 00000001
int b = -1; b的反码就是 11111111 11111111 11111111 11111110

补码

反码+1得到补码。

例:int a=1; a的补码就是 00000000 00000000 00000000 00000001
int b = -1; b的补码就是 11111111 11111111 11111111 11111111

为什么整型数据在内存中以补码的形式存在?

在计算机系统中,数值一律用补码来表示和存储,原因在于使用补码可以将符号位和数值位统一处理;同时加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是形同的,不需要额外的硬件电路。

例:l两个整形数据1-1相运算过程。其实可以转化为1+(-1)
int a=1;
a的原码就是 00000000 00000000 00000000 00000001
a的反码就是 00000000 00000000 00000000 00000001
a的补码就是 00000000 00000000 00000000 00000001
int b = -1;
b的原码就是 10000000 00000000 00000000 00000001
b的f反码就是 11111111 11111111 11111111 11111110
b的补码就是 11111111 11111111 11111111 11111111
两数相加
假定用原码相加
00000000 00000000 00000000 00000001
10000000 00000000 00000000 00000001
结果是 10000000 00000000 00000000 00000010 (负数取出要转为原码)
原码=(反码-1)后再符号位不变其他为按位取反
原码就是 1111111 11111111 11111111 11111110(即-2^31+2)显然不正确
假定补码相加
00000000 00000000 00000000 00000001
11111111 11111111 11111111 11111111
结果的 1 00000000 00000000 00000000 00000000
保留一个整形的长度之后就是
00000000 00000000 00000000 00000000 (即0)

以上例子说明了整形在内存中以补码形式存在的。

整形家族中char类型的范围

如图,signed char 的范围为-128~127,unsigned char的范围为 0 ~ 255。
在这里插入图片描述

整形数据存储中的大小端模式

这里可以看看我的往期博客整形数据在内存中存储的大小端模式

有关整形在内存中存储的几道题目

题1:

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

我们来看到这样一串代码,分析如下:
在这里插入图片描述
所以答案是a=-1,b=-1,c=255。
题2:

#include <stdio.h>
int main()
{
  char a = -128;
  printf("%u\n",a);
  return 0;
}

分析如下:
在这里插入图片描述
所以答案是4294967168。
题3:

#include <stdio.h>

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

分析如下:
在这里插入图片描述
题4:

#include <stdio.h>

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

分析如下:
在这里插入图片描述
所以答案为-10。
题5:

#include <stdio.h>

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

分析如下:
在这里插入图片描述

在这里插入图片描述
题6:

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

分析如下:在这里插入图片描述
所以答案是255。
题7:

#include <stdio.h>
unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}
	return 0;
}

分析如下:
在这里插入图片描述
在这里插入图片描述

今天就简单介绍到这了,欢迎大家点赞支持和指正~

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 14:54:28  更:2021-08-20 14:54:47 
 
开发: 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/20 14:03:57-

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