返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c语言 数据存储与原码 反码 补码详细解析
  • 168
分享到

c语言 数据存储与原码 反码 补码详细解析

2024-04-02 19:04:59 168人浏览 安东尼
摘要

目录前言1.数据的类型介绍1.1整形家族2.整形在数据内存中的存储2.1 原码 反码和补码(三种整型数的表示方法)2.2大小端字节序序的介绍2.3 练习3.浮点型在内存中的存储3.1

前言

学习本章你会了解:

1.数据类型详细介绍

2.整形在内存中的存储:以及了解原码、补码、反码

3.大小端字节序的介绍和判断

4.浮点型在内存中的存储解析

1.数据的类型介绍

在学习数据储存之前,让我们先认识一下数据类型。以下这些数据类型是我们初学C语言时的基础类型以及大小所占字节数。

比如所占字节数类型
char1//符数据的类型
shot2//短整型
int4//整形
long (规定sizeof(long)>=sizeof(int) )4//长整型
long long(部分编译器不支持)8//更长的起整数
float4//单精度浮点数
double8//双精度浮点数

还有构造类型:

数组类型

结构体类型struct

枚举类型enum

联合类型uNIOn

指针类型:

int* pa;

char* pb;

float* pc;

void* pd;

除了以上类型,实际上还有布尔类型:_Bool(专门用来表示真假的类型)

举个栗子(在c99中可用)


#include<stdio.h>
#include<stdbool>
main()
{
_bool flag=true;
if(flat)
printf("hello world")
return 0;
}              //结果就会打印一个hello world

1.1整形家族

整形家族中包括int short long,还有char。

char也是整形家族中的吗?

答案是:是的,因为char对应的字符的ascii码值中,字符对应的就是整形。

在这些整形类型之中,还可以分为无符号整形和有符号整型:

int=signed int

short=signed short

long=signed long

那是否char 等于 signed char呢

结果又跟其他整形家族中的成员不同,在标准情况下char不是等于sign char~(但是在常规编译器中是相等的)。

2.整形在数据内存中的存储

我们知道变量创建就是开辟空间,开辟空间的大小由数据的类型来决定。

那么数据在所在的空间是怎样储存的呢?

在vs2019中输入:


int    a=20;
int    b=-10;

就代表在内存中开辟四个字节的空间

 其中14 00 00 00 就是a十六进制对应反码的值

和前面相同,f6 ff ff ff就是b十六进制对应反码的值

我们都知道计算机都是以二进制来存储信息,那为什么在内存图中看到的是十六进制呢?

这仅仅是便于观察,当以十六进制储存时,有没有感到反码有点长呢,如果换成二进制就更不宜观察了,故规定以十六进制来保存。

提到这里,什么是反码呢?为什么又反码的出现呢?

2.1 原码 反码和补码(三种整型数的表示方法)

原码:原码就是数字对应二进制的表示方法,其中最后一位数字是符号位,表示正负的,

而小字节序就是二进制对应的是数。

如a的原码是:0000 0000 0000 0000 0000 1010 

反码:反码的数值就是在原码的基础之上进行转换过来的,当数值为正数时,反码的数据大小跟原码相同,当数值是负数是,其反码的值就是在原码的基础上,除了符号位,其他位都是按位取反。

补码:补码数值为正数时,其值大小就是原码,为负时,其值的大小就是在反码的基础之上,在进行加一。

原码得到补码取反加一即可,其实补码得到原码也是取反加一(感兴趣的可以试试)

举个栗子:

a的原码 反码 补码

原:0000 0000 0000 0000 0001 0100 

反:0000 0000 0000 0000 0001 0100 

补:0000 0000 0000 0000 0001 0100 

b的原码 反码 补码

原:1000 0000 0000 0000 0000 1010

反:1111 1111   1111  1111  1111  0101

补:1111 1111  1111   1111   1111  0110

那我们系统会出现原码反码和补码三种表示方法呢,一种表示方法不行吗?

我们能想到的,科学家也能想到,但一种表示方法有缺陷。

就比如说:当计算1+(-1)的时候(计算机只能实现加法的运算)

统一用原码的结果是

0000 0000 0000 0000  0000 0001

1000 0000 0000 0000 0000  0001

结果是1000 0000 0000 0000 0000  0010

用补码计算的结果是:

0000 0000 0000 0000 0000  0001

0111  1111  1111 1111  1111  1111

结果是1000 0000 0000 0000 0000 0000 也就是0

你是不是瞬间知道为什么要三种表示方法,为什么有补码的存在了

有没有get到科学家的伟大之处

2.2大小端字节序序的介绍

大小端字节序分别是哪一种?

a在内存中的数值44 33 22 11就是小端字节序

那大端字节序就是11 22 33 44

大小端字节序的定义是什么?

大端字节序:当一个数的低字节序放在高地址处,或者高字节序的放在低地址处时,就是我们所说的大端字节序。

小端字节序:当一个数的高字节序放在低地址处,或者低字节序的放在高地址处时,就是我们所说的小端字节序。

放在倒着就是小端字节序,记住它即可。

为什么数据要分大小端字节序呢?

大小端字节序来源于于乔纳森·斯威夫特的小说《格列佛游记》,这是因为在计算机系统中,我们都是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit,但是在c语言中除了8bit的char之外,还有16bit的short型,32bit的long型(看具体编译器),另外,对于位数大于8位的处理器,例外16位的或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节序排序的问题。因此就导致了大端存储模式,和小端存储模式。

 那么怎么判断大小端字节序呢?

下面由一个例题来讲解:(这是百度2015年系统工程师的笔试题)

用代码来判断系统大小端字节序:


int a;
 
char*pa=(char*)&a;
 
if(*pa==1)
 
printf("小端字节序“);
 
else
 
printf(“大端字节序”);

2.3 练习

题一:


//输出结果是什么
#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
}

输出的结果分别是-1 -1 255

前面两个很容易理解 signed char与char意思都是有符号的整数,所以打印的结果都是-1.

都是对于无符号来说这时候就要进行整形提升了

当char型以整形来打印时过程如下:

原码:10000001

反码:11111110

补码:11111111

unsigned整形提升后:0000 0000 0000 0000 1111 1111

这是的补码同样也是: 0000 0000 0000 0000 1111 1111

就是最终c的值。

题二:


​#include<stdio.h>
 
int main()
{
char a=-128;
printf(%u\n",a);  //u就是以无符号的类型打印出来
return 0;
}

-128的原码: 1000 0000 0000 0000 1000 0000

反码1111 1111 1111 1111 0111 1111

补码1111  1111 1111 1111 1000 0000

因为是char型 补码提取后:10000000

正进行整形提升,因为char是无符号整形,所以提升后:

1111 1111 1111 1111 1000 0000

再以无符号整形形式打印后原反补相同即:1111 1111 1111 1111 1000 0000

再转化成十进制:4294967169

运行证明以如下

数据的范围是多少呢?unsigned char与char存放的数据是否相等呢?

事实证明char与unsigned char数据范围并不一样

char的整形数据范围是-128~127,而unsigned char的范围是0~255;

(short 与unsigned short的整形取值范围也不一样

short的整形数据范围是-32768~32767,而unsigned short能存储的数据范围则是0~65535

3.浮点型在内存中的存储

首先列出一个常见浮点数表示方法:

1E10 可能你并不知道这是什么意思;

实际上他的意思是1.0*10^10;

3.1 先举一个例子


#include<stdio.h>
int main()
{
int n=9;
float*pFloat=(float*)&n;
printf("n的值为:%d\n",n);
printf("*pFloat的值为:%f\n",pFloat);
*pFloat=9.0;
printf("num的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
return 0;
}

n的值为:9

*pFloat的值为:0.00

num的值为:1091567616

*pFloat的值为:9.000000

  这个结果是否跟你想的一样呢?

 其实n的值与最后一个*pFloat的值可能我们很容易知道(也可能是猜的 哈哈)

在求解这道题之前让我们先了解这个题的知识吧~

3.2 浮点数储存的规则

IEEE(电气和电子工程协会754标准)标准规定:

任何二进制的浮点数都可以以这种标准表示出来:

基本公式是:(-1)^S*M*2^E;(这里的E是无符号类型)

其中M是有效数子,E是指数,S用来表示正负;

举个栗子:

5.5——10进制的表示

转化为二进制的结果是:101.1;

用公式表示为:(-1)^0 (1.011)*2^2    此时S=0,M=1.011,E=2;

 对于64位浮点数,最高位1位是符号位s,接着是11位是指数E, 剩下的52位是有效数字。

如果E为八位,他的取值范围0~255,如果E为11为,他的取值范围0~2047;

有两个极限 

当E为0时,此时的真实的E为1-127=-126;此时的数值根据公式,也就是无限接近与0;

当E为254时,此时的真实的E为254-127=127;此时的数值根据公式,也就是无穷大。

说到这里,你可能有一点疑惑,为什么都要减一个127,这是因为避免出现E为负数的情况(因为这里的E是无符号整形),在真实的E的基础上加了127,所以为了得到求出真实的E,就需要减去一个127.

 现在回到原来的题目之上

0000 0000 0000 0000 0000 0000 0000 1001--九的原码反码与补码。

这里的0 是 s;00000000为E;0000000000000000001001为m

此时(-1)^0*0.00000001*10*2^(-126)

由于float默认只打印小数点后六位,所以最终打印0.000000;

九的转化位二进制:1.001;

1.001*2^3

=0 M=1.001 E=3;

0100 0001 0001 0000 0000 0000 0000 0000

再以整形的形式打印的话,此时的值就是0100 0001 0001 0000 0000 0000 0000 0000就是num的补码,由于符号位是0,所以最终的原码等于补码。也就是1091567616

如果以浮点型打印的话也就是9.000000

结语:

写的很长时间,如果有用就收藏吧

到此这篇关于c语言 数据存储与原码 反码 补码详细解析的文章就介绍到这了,更多相关c语言 数据存储内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: c语言 数据存储与原码 反码 补码详细解析

本文链接: https://lsjlt.com/news/138781.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • c语言 数据存储与原码 反码 补码详细解析
    目录前言1.数据的类型介绍1.1整形家族2.整形在数据内存中的存储2.1 原码 反码和补码(三种整型数的表示方法)2.2大小端字节序序的介绍2.3 练习3.浮点型在内存中的存储3.1...
    99+
    2024-04-02
  • c语言中数据存储与原码、反码、补码的示例分析
    这篇文章主要介绍了c语言中数据存储与原码、反码、补码的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.数据的类型介绍在学习数据储存之前,让我们先认识一下数据类型。以...
    99+
    2023-06-29
  • c语言原码、反码、补码与位运算的概念是什么
    本文小编为大家详细介绍“c语言原码、反码、补码与位运算的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“c语言原码、反码、补码与位运算的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深...
    99+
    2024-04-02
  • C语言数据存储详解
    目录一、数据类型二、整型在内存中的存储1.原码、反码、补码大小端介绍三、浮点型在内存中的存储1.举一个浮点数存储的例子: 2.浮点数存储规则: 总结一、数据类型 char:字符数字类...
    99+
    2024-04-02
  • C语言数据的存储详解
    目录数据类型的介绍整形浮点型构造类型指针类型void空类型整数在内存中的存储原反补的介绍大小端的介绍面试例题练习浮点数在内存中的存储存储规则讲解举例IEEE754的特别规定案例flo...
    99+
    2024-04-02
  • C语言数据的存储超详细讲解上篇
    目录前言1、数据类型介绍类型的基本归类2、整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍2.2.1 什么是大小端2.2.2 大端和小端意义2.2.3 写程序判断字节序总...
    99+
    2024-04-02
  • C语言中数据的存储详解
    目录1.内置类型(1)整型数组(2)浮点型2.自定义类型3.指针类型4.空类型(void)字符型浮点型(一)(二)总结 数据的存储首先就要说到数据的类型,类型决定了看待内存空间的视角...
    99+
    2024-04-02
  • 详解C语言中数据的存储
    目录一、类型归类1、整形家族2、浮点型家族3、指针类型4、空类型二、类型的意义 三、数据在类型中存储(以整形和浮点型为例子)1. 关于 存储的基本概念2.存储模式四.应用1.2.对...
    99+
    2024-04-02
  • C语言详细分析浮点数在内存中的储存
    目录浮点数的储存格式初步了解深入探究E不全为0或不全为1E全为0E全为1浮点数的储存格式 初步了解 首先让我们通过一段代码来认识一下浮点型和整型的区别: int main() { ...
    99+
    2024-04-02
  • C语言数据的存储超详细讲解中篇练习
    目录前言数据的存储的知识点练习练习 1练习 2练习 3练习 4练习 5练习 6练习 7总结前言 本文继续学习数据在内存中存储的相关知识点。 数据存储整型提升 数据的存储的知识点练习 ...
    99+
    2024-04-02
  • C语言详细图解浮点型数据的存储实现
    目录在引入知识之前,先来看一个案例,就知道了解浮点型数据存储的重要性与必要性。 举个例子: #define _CRT_SECURE_NO_WARNINGS 1 #include<...
    99+
    2024-04-02
  • Java和c语言随机数Random代码详细
    目录一、随机数的创建步骤1.导包2.创建对象3.数据接收二、Java随机数游戏三、c语言的猜数字一、随机数的创建步骤 1.导包 所谓导包就是在Java中已经定义好的文件,我们直接引...
    99+
    2024-04-02
  • C语言数据在内存中的存储详解
    目录文章摘要一、C语言的数据类型数据类型基本分为: 二、隐式类型转换1.什么是隐式类型转换2.整型提升 3.类型转换三、机器大小端1.什么是大小端2.大小端在截断的应用3....
    99+
    2024-04-02
  • PHP代码转C语言:实现原理与技巧详解
    PHP和C语言是两种常用的编程语言,它们在不同的领域具有各自的优势和特点。PHP是一种脚本语言,通常用于Web开发,而C语言是一种编译型语言,通常用于系统编程和嵌入式开发。在一些特定情...
    99+
    2024-03-13
    php c语言 转换
  • 深度解析C语言中数据的存储
    目录前言数据类型介绍类型的基本归类整型家族浮点数家族构造类型指针类型空类型前言 在VS编译器里有release和debug两种形式,debug包含调试信息,release不包含调试信...
    99+
    2024-04-02
  • C语言链表详解及代码分析
    目录什么是链表环境构建建立静态链表包含所需要的头文件宏定义相关变量创建一个结构体主函数结果展示说明建立动态链表包含所需要的头文件宏定义相关变量创建一个结构体建立链表函数主函数结果展示...
    99+
    2024-04-02
  • C语言编程数据在内存中的存储详解
    目录变量在计算机中有三种表示方式,原码反码,补码原码反码补码总结一下浮点数在内存的储存C语言中,有几种基本内置类型。 int unsigned int signed int cha...
    99+
    2024-04-02
  • C语言超详细讲解栈的实现及代码
    目录前言栈的概念栈的结构栈的实现创建栈结构初始化栈销毁栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空总代码Stack.h 文件Stack.c 文件Test.c 文件前言 栈...
    99+
    2024-04-02
  • C语言数据结构之单链表存储详解
    目录1、定义一个链表结点2、初始化单链表3、输出链表数据4、完整代码如果说,顺序表的所占用的内存空间是连续的,那么链表则是随机分配的不连续的,那么为了使随机分散的内存空间串联在一起形...
    99+
    2024-04-02
  • 关于C语言中数据在内存中的存储详解
    目录前言一、数据类型介绍1.类型的基本归类1.整形家族2.浮点型家族3.构造类型4.指针类型5.空类型二、整型在内存中的存储1.原码、反码、补码2.内存中怎样存储3.大小端字节序1....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作