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语言最详细讲解数据的存储篇1:整形数据存储及整形提升 -> 正文阅读

[C++知识库]C语言最详细讲解数据的存储篇1:整形数据存储及整形提升


前言

提示:数据存储这块知识,笔者将分两篇文章进行讲解,本篇文章主要讲解整数数据的存储,下一篇将会讲解浮点型数据。在学习数据存储前,小伙伴们最好要提前自习一下signed 和unsigned存储的区别,在内存中数据是以补码进行存储,并能快速将原反补码进行转换,还有整形提升相关知识。


提示:以下是本篇文章正文内容,下面案例可供参考

ps:在c语言中,char到底是signed char还是unsigned char这个是取决于编译器的,笔者当前编译器vs2017下,char==signed char.

一、引子

#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);//打印-1 -1 255
	return 0;
}

对于char a=-1,这句话即把-1放a里面,内存中存的是-1的补码
我们知道-1的原码10000000000000000000000000000001
反码1111111111111111111111111111111111110(符号位不变,其他位取反)
补码1111111111111111111111111111111111111(反码+1)

得到-1补码后,问题就来了:-1是一个整形,但是a只是一个字符啊,a只占1个字节,在存储时,会发生截断,截断的结果就是,只会保留8个比特位(整形32比特位,占1/4)
a里面放的就是:11111111
同理可得b、c里面放的都是11111111
解释:截断都是8比特位,不管你最高位是符号位还是有效位。
既然存储的都是一样的,为什么打印出来不同?

%d以有符号整数的形式进行打印
a是一个字符型啊,你要以整数形式打印,它达不到一个整形大小啊,这时需要进行整形提升,让a提升到一个整形再进行打印
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、整形提升的具体步骤

1.以上文a为例

a:11111111,由于a是char,是有符号的,最高位1为符号位,整形提升是按原来符号位提升,前面全部补1得到11111111111111111111111111111111(整形提升后补码),我们要知道,数据存储是用补码,数据打印是用的原码,我们进行一下原反补转换:
11111111111111111111111111111111(补)
11111111111111111111111111111110(反)
1000000000000000000000000001(原)转十进制就是-1(最高位为1表示负数)
这样a=-1就打印出来了。
由于char 和signed char类型是一样的,b就不再进行讨论,接下来我们讨论unsigned char c
由引子我们知道,c内存中存储的是11111111,以%d打印一个整形,也要对c进行整形提升,但是因为unsigned char c所以最高位不是符号位,对于无符号的数字,整形提升是高位补0,得到00000000000000000000000011111111(补),但是你打印的时候是%d,是有符号的整数,那这里的补码被视为是有符号的,因为最高位为0,所以是正数,正数的原反补码一样,即原码也是00000000000000000000000011111111,转十进制为255

2.举一反三

代码如下(示例):

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

这里会打印4,294,967,168 解释如下:
-128的原反补如下:
原码 10000000000000000000000010000000
反码 11111111111111111111111101111111
补吗 11111111111111111111111110000000
a补码10000000
%u以无符号数形式打印整形 无符号高位补0(ps:如果是有符号的,高位是1补1,高位是0补0)
整形提升:00000000000000000000000010000000(补)
00000000000000000000000001111111(反)
11111111111111111111111110000000(补)-十进制4,294,967,168

ps:关于什么时候需要整形提升,也就是你类型大小小于int型,比特位不足32位时,要补到32位(你用%d或%u打印嘛)


总结

提示:本文的整形数据存储,我们要知道以下知识点:
1.整形数据放入字符型中会发生截断
2.内存中存储的是补码,要打印时用的是原码
3.打印时,如何知道要不要整形提升?
4.整形提升要注意判别是signed和unsigned

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

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