前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一个变量在内存中是如何存储的

一个变量在内存中是如何存储的

作者头像
小明爱学习
发布于 2020-05-12 02:58:09
发布于 2020-05-12 02:58:09
3K1
举报
文章被收录于专栏:smh的技术文章smh的技术文章

我们自学习一门高级语言时,都要了解数据成分,可你们知道在高级语言中数据都是如何在内存中存储的吗?今天我就来介绍一下。

语言:C++

int c=-123;

这只是一个简单的定义了一个变量,变量名为c,值为-123。

然而我们大家应该都知道,计算机存储数据都会以二进制的形式来存储。

然后一个int在一般情况下都计算机都占4个字节,也就是32个bit。某些比较老的编译器int只占16个bit。

其次这还是一个有符号的int类型,所谓有符号,就是这个int可表示负数。因为有符号,所以必须拿出一个bit来当作符号位,那么表示数据的位数也就只有31位了。

转换过程:

首先确定符号位,这是一个负数,所以符号位为1,在数据最前面,然后把123转为二进制为:1111011,123占了7个bit,还剩下24个bit都用0补齐。

得出的原码就是:

通过原码得到反码,反码就是在原码的基础中,取反,如果原码的值为0,就变为1,如果值为1就变为0,符号位不变。

最后通过反码得到补码,补码就是在反码的基础加1即可。

然后变量c在内存就占了四个字节,对应的就是上面的补码。

然后接着谈无符号的int。

unsigned int c=123;

要声明一个无符号的int变量,只需要在int前面加上unsigned即可,这样这个int变量只能表示正数,不能表示负数,这样就不用单独拿一个bit出来当作符号位,这样32个bit都用来表示数据,所以无符号的int型可表示的正数范围也更大。

转换过程:

这是无符号的类型,所以不需要确定符号位,直接把123转为二进制为:1111011,占用了7个bit,其余的25个bit用0补齐。

得出的原码就是:

这里说明一下:如果是无符号数,即原码就是补码,不需要和有符号数那样进行多次的转换,内存中存储的就是原码。

用例子来证明一下:

变量test为无符号int变量,变量test1为有符号int变量,变量test2为无符号int变量。

然后把12和-13相加,很明显大家都知道是-1,但是我们来看看结果:

结果却不是-1,我们来分析一下。

首先-13加12肯定是-1,因为有负号,所以是一个有符号int型的数值。

所以就要求出这个数的补码,我上面说过,有符号数,在内存中存储的都是补码。

首先是一个符号,符号位为1,然后1的二进制就是1,还剩下30个bit用0补齐。

得到原码:

然后根据原码得到反码(过程上面有,不在赘述):

然后根据反码得到补码:

由于我们test2是一个无符号的int型变量,所以他就把这个32个1直接转为了10进制,也就是

看到这里,我相信大家应该明白了变量是如何在内存中表示的,以及有符号和无符号变量的区别了吧。

注意:只有当数值为负数时,在内存中才会存补码形式。

比如:int i=124;

虽然我定义的一个有符号型的int变量,但是由于i是一个正数,所以在内存中的存储形式为原码:

唯一和无符号不同的是,就是最高位是符号位,不能用于来存储数值。

我们用二进制的形式来做个加法,让各位更直观的理解。

-15+10=-5;

这里我只有8个bit来表示。

首先把-15转为补码为:11110001,然后10的补码(也就是原码,因为10是正数):00001010

得到的二进制结果就是

由于最高位是1,所以是个负数,所以这就是个补码的形式的二进制,我们需要将补码转为原码,才可以得到最后的结果。

补码转原码的方法跟上述一样,先取反,然后加1,得到: 0 0 0 0 0 1 0 1,转为十进制就等于5

通过上述一个程序例子,和这个加法的例子,我相信各位应该了解了吧。

后面的文章我会解释,为什么要存在补码形式,都用原码不是更方便吗?

各位再见。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年05月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
这篇文章对你有帮助吗?作为一名程序工程师,在评论区留下你的困惑或你的见解,大家一起来交流吧!
这篇文章对你有帮助吗?作为一名程序工程师,在评论区留下你的困惑或你的见解,大家一起来交流吧!
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
揭秘Kafka拦截器的神奇操作
在消息传递的舞台上,拦截器就像是一群守护神,负责保卫信息的流转。这些守门者在系统中扮演着至关重要的角色,为数据的安全和处理创造奇迹。本文将带你走进这个神奇的领域,探寻拦截器的神奇之处。
一只牛博
2025/05/30
390
揭秘Kafka拦截器的神奇操作
Kafka教程_图解kafka
推荐【Kafka教程】https://bigbird.blog.csdn.net/article/details/108770504 推荐【rabbitmq教程】https://bigbird.blog.csdn.net/article/details/81436980 推荐【Flink教程】https://blog.csdn.net/hellozpc/article/details/109413465 推荐【SpringBoot教程】https://blog.csdn.net/hellozpc/article/details/107095951 推荐【SpringCloud教程】https://blog.csdn.net/hellozpc/article/details/83692496 推荐【Mybatis教程】https://blog.csdn.net/hellozpc/article/details/80878563 推荐【SnowFlake教程】https://blog.csdn.net/hellozpc/article/details/108248227 推荐【并发限流教程】https://blog.csdn.net/hellozpc/article/details/107582771 推荐【JVM面试与调优教程】https://bigbird.blog.csdn.net/article/details/113888604
全栈程序员站长
2022/11/03
2.3K1
Kafka教程_图解kafka
kafka拦截器实现队列插队效果
突然出现一个任务需要对kafka处理的数据进行插队操作(内心小崩溃。。。),研究了一下,还是可以使用拦截器进行实现这样的效果的。
conanma
2022/04/11
3650
Kafka Producer拦截器(Interceptor)
本篇主要讲述的是Kafka Producer端的拦截器,它主要用来对消息进行拦截或者修改,也可以用于Producer的Callback回调之前进行相应的预处理。
JavaEdge
2021/10/18
3260
kafka系列之Producer 拦截器
Producer 拦截器 拦截器(interceptor)是个相当新的功能,它是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑。
程序狗
2021/12/20
3970
Kafka Producer拦截器(Interceptor)
本篇主要讲述Kafka Producer端拦截器,对消息进行拦截或修改,也可用于Producer的Callback回调之前进行预处理。
JavaEdge
2021/12/07
6300
Kafka Producer拦截器(Interceptor)
多图详解kafka生产者消息发送过程
KafkaProducer通过解析producer.propeties文件里面的属性来构造自己。 例如 :分区器、Key和Value序列化器、拦截器、RecordAccumulator消息累加器 、元信息更新器、启动发送请求的后台线程
石臻臻的杂货铺[同名公众号]
2022/09/26
6620
多图详解kafka生产者消息发送过程
KafkaProducer通过解析producer.propeties文件里面的属性来构造自己。 例如 :分区器、Key和Value序列化器、拦截器、RecordAccumulator消息累加器 、元信息更新器、启动发送请求的后台线程
石臻臻的杂货铺[同名公众号]
2022/04/30
1.9K0
多图详解kafka生产者消息发送过程
看完这篇Kafka,你也许就会了Kafka[通俗易懂]
Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理。既然是消息队列,那么Kafka也就拥有消息队列的相应的特性了。
全栈程序员站长
2022/08/24
17.2K4
看完这篇Kafka,你也许就会了Kafka[通俗易懂]
Kafka体系架构详细分解
我的个人博客排版更舒服: https://www.luozhiyun.com/archives/260
luozhiyun
2020/03/19
8640
数据源管理 | Kafka集群环境搭建,消息存储机制详解
Kafka集群中有一个broker会被选举为Controller,Controller依赖Zookeeper环境,管理集群broker的上下线,所有topic的分区副本分配和leader选举等工作。
知了一笑
2020/06/16
6320
Kafka基础(二):生产者相关知识汇总
本文章部分内容摘自 朱忠华老师的《深入理解Kafka:核心设计与实践原理》,也特别推荐广大读者购买阅读。
create17
2019/06/24
9940
「kafka」kafka-clients,java编写生产者客户端及原理剖析
构建的消息对象ProducerRecord并不是单纯意义上的消息,它包含了多个属性,原本需要发送的业务相关的消息体只是其中的一个value属性,比如“hello world”,ProducerRecord的源码如下:
源码之路
2020/09/04
1.7K0
「kafka」kafka-clients,java编写生产者客户端及原理剖析
kafka生产者Producer、消费者Consumer的拦截器interceptor
1、Producer的拦截器interceptor,和consumer端的拦截器interceptor是在kafka0.10版本被引入的,主要用于实现clients端的定制化控制逻辑,生产者拦截器可以用在消息发送前做一些准备工作,使用场景,如下所示:
别先生
2021/01/13
1.7K0
Kafka快速入门系列(11) | Kafka中如何自定义Interceptor及其原理
  Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑。   对于producer而言,interceptor使得用户在消息发送前以及producer回调逻辑前有机会对消息做一些定制化需求,比如修改消息等。同时,producer允许用户指定多个interceptor按序作用于同一条消息从而形成一个拦截链(interceptor chain)。Intercetpor的实现接口是org.apache.kafka.clients.producer.ProducerInterceptor,其定义的方法包括:
不温卜火
2020/10/28
6730
Kafka快速入门系列(11) | Kafka中如何自定义Interceptor及其原理
源码分析 Kafka 消息发送流程(文末附流程图)
从上文 初识 Kafka Producer 生产者,可以通过 KafkaProducer 的 send 方法发送消息,send 方法的声明如下:
丁威
2019/11/12
1.4K0
源码分析 Kafka 消息发送流程(文末附流程图)
连Producer端的主线程模块运行原理都不清楚,就敢说自己精通Kafka?
在介绍Producer端原理之前,大家先对其整体架构有一个大致的了解,图示如下所示:
爪哇缪斯
2023/09/05
1980
连Producer端的主线程模块运行原理都不清楚,就敢说自己精通Kafka?
Kafka扩展内容
Intercetpor的实现接口是org.apache.kafka.clients.producer.ProducerInterceptor。
matt
2022/10/25
3530
Kafka消息分区&producer拦截器&无消息丢失(八)
上篇文章说了,acks,1代表什么都不管,即使配置了回调也不会起作用,0代表不会等待replic副本里的不会持久化,只要broker leader持久化成功则返回给producer。-1代表all,则表示全部持久化成功才返回成功给producer,Retries,batch.size:kafka,linger.ms,buffer.memory,compression.type等参数。
用户9919783
2022/12/14
4150
消息队列之Kafka-生产者
KafkaProducer 是线程安全的,可以在多个线程中共享单个 KafkaProducer 实例,也可以将 KafkaProducer 实例进行池化来供其他线程调用。
conanma
2022/04/08
5190
推荐阅读
相关推荐
揭秘Kafka拦截器的神奇操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档