首页
学习
活动
专区
圈层
工具
发布

探秘C语言:数据在内存中的存储机制详解

将任意进制转换为十进制的通用方法是:按位取数×位权,再求和。例如,二进制1011转换为十进制为:1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 11。...表格中仅列出了部分常用数值,更大的数值可通过“除基取余法”“乘基取整法”等规则进行转换。例如,十进制转二进制时,用十进制数反复除以2,取余数倒序排列即可。...原码、反码、补码 整数的二进制表示有三种形式,其核心区别在于对负数的处理: 无符号整数:所有二进制位均用于表示数值,无符号位。 有符号整数:最高位为符号位(0表示正,1表示负),其余位为数值位。...例:+3的8位二进制表示 原码:00000011 反码:00000011 补码:00000011 负整数 三种形式不同,转换规则如下: 原码:符号位为1,数值位为该数绝对值的二进制。...统一符号位与数值位:补码让符号位可参与运算,无需单独处理。 简化加减法:CPU只需加法器即可,减法可转换为"加负数的补码"(如a-b = a + (-b)的补码)。

37710

从强转 byte 说起

我们带上符号位,回过头来重新分析上面对 128 的强转:当高位的三个字节被舍弃掉之后,连同舍弃的还有它的符号位 0 ,最终的结果就是强转成单字节后,原来表示数值部分的 1 变成了符号位,表示为负,除去符号位...为了不增加计算机底层设计的复杂度,人类还是决定在符号位上下功夫,于是有了我们熟知的二进制领域中的 原码,反码以及补码等等概念,下面是三种码基本的表示的方法: 原码:符号位(字节序列的最高位)加上原数值绝对值的二进制表示...为什么上述中的整数也可以表述成模呢?因为二进制的进位溢出其实同模运算中遇整舍弃只留余数是一样的道理。具体到生活中我们可以用时钟来作比。...,所以,知道如何将长字节数变短,也是很有必要滴。   ...哇,这个结果,看起来这个数好大的样子,其实不大,因为博主早就说过了计算机是以补码的形式存储二进制的,将该补码转回原码你会发现,才等于 -2 ,挺小的,不过和原来的 -258相差太多了。

2.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C#学习笔记03】进制转换与反码、补码、原码

    1.2.3 二进制转八进制 将二进制数从右到左每三位一组,不足三位补零,然后将每组转换为对应的八进制数。...1.2.4 二进制转十六进制 将二进制数从右到左每四位一组,不足四位补零,然后将每组转换为对应的十六进制数。...可以知道,计算机内部是以二进制的补码方式来存储数据的,所以需要把二进制数的原码转换为补码形式。 可以知道,正数的原码和补码是相同的,所以负数才需要把原码转换为补码,再进行存储!...2.1 原码 原码是二进制数的最基本表示形式,最高位为符号位(0表示正数,1表示负数),其余位表示数值。 ​​...字符型: char  1字节 -- 有符号 -- 数值范围 -128 ~ 127  --  无符号 -- 数值范围 0 ~ 255 短整型:short  2字节 -- 有符号 -- 数值范围 -32768

    72310

    基础类型BigInteger简介

    下面会详细介绍 使用字节数组构造 内部是Int数组,一个int 32位就是 4个字节,所以自然是可以使用字节对BigInteger进行构造的 提供了两种形式的字节构造方法,可以指定符号的...使用字节进行构造,就是把所有的字节填充到int数组中 不过要注意的是, 计算机中存储的数值都是补码的形式 正数的补码与原码相同 负数的补码是他的原码取反再加一 就是把这些字节的补码按照顺序拼在一起...通过这两个例子应该可以看得出来,数值都是补码形式存放 字节存储的也是补码 , int存储的也是补码, 所以使用字节构造 就是把所有的补码拼凑在一起就好了 拼凑排列好的补码,如果是正数,那么原码/...BigInteger modInverse(BigInteger m) bitCount与bitLength public int bitCount()返回此 BigInteger 的二进制补码表示形式中与符号不同的位的数量特别注意这个方法的含义不是二进制补码表示形式的...1 位的数量,而是与符号不同的 bitLength最小的二进制补码表示形式的位数,不包括 符号位对于正 BigInteger,这等于常规二进制表示形式中的位数  就是去掉符号位占用的长度 valueOf

    2.9K40

    【C语言】操作符超详细总结

    二进制和进制转换 其实我们经常能听到 2进制、8进制、10进制、16进制 这样的讲法,那是什么意思呢?其实2进制、8进制、10进制、16进制是数值的不同表示形式而已。...比如:数值15的各种进制的表示形式: 15的2进制:1111 15的8进制:17 15的10进制:15 15的16进制:F 16进制的数值之前写:0x 8进制的数值之前写:0 我们重点介绍一下二进制...原码、反码、补码 整数的2进制表示方法有三种,即原码、反码和补码 有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号位,剩余的都是数值位。...正整数的原、反、补码都相同。 负整数的三种表示方法各不相同。 原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。...为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整 型提升。

    59610

    (二)《数字电子技术基础》——数制

    目录 数制介绍 数制转换 各进制转换为十进制 十进制转换为其他进制 十进制转二进制 十进制转其他进制 二进制与八进制之间的转换 二进制转八进制 八进制转二进制 二进制与十六进制之间的转换       ...二进制转十六进制 十六进制转二进制 八进制与十六进制之间的转换 二进制正负数及其表示 二进制算术运算 二进制正负数的表示法 二进制正负数的顶点浮点表示法 二进制数补码及其运算 二进制数三种表示法​​​​​​​...数制转换 各进制转换为十进制 十进制转换为其他进制 十进制转二进制         整数部分:除基取余,逆序排列。...十进制转其他进制         将十进制转换为R进制的方法:整数部分采用基数 (R)除法,即除基(R)取余,逆序排列;小数部分采用 基数(R)乘法,即乘基(R)取整,顺序排列,与十进制转二进制类似,就不做过多介绍...设A和B依次为被加数(或被减数)和加数(或减数),用补码实现加/减运算的步骤如下: 把A与B(减法时为-B)均表示成补码形式; 两个补码相加,且把符号位也看成二进制的最高 位参与运算; 若和数的最高位有进位

    2.4K21

    数字规则:进制转换与原码、反码、补码

    在计算机的数字世界里,所有信息最终都以二进制形式存储和处理。而理解原码、反码和补码这三种编码方式,是揭开计算机数值运算奥秘的关键。...(2).八进制转二进制​ 方法:将八进制的每一位转换为对应的3位二进制数。​ 例如,将八进制数73转换为二进制数:​ 7转换为二进制是111,3转换为二进制是011,所以结果为111011。​...3.十六进制​ 应用场景:在计算机领域常用于表示内存地址、颜色值(如网页设计中的RGB颜色用十六进制表示)、字节数据等。因为十六进制数与二进制数转换方便,且书写比二进制简洁。​...(3).原码的特点与局限​ 优点:直观易懂,与十进制转换简单,只需确定符号位,再将数值部分转换为二进制即可。​ 缺点:0有两种表示形式(+0为00000000,-0为10000000)。​...在计算机底层进行补码计算时,可能会先将原码转换为反码,再进一步得到补码。​ 补码:计算机底层存储、运算的唯一编码形式。无论是整数的加减乘除运算,还是数据在内存中的存储,都以补码的形式进行。​

    1.3K20

    .NET C# 教程初级篇 1-1 基本数据类型及其存储方式

    占用内存分别为(位数/8)字节。范围则是 +-(位数)个1组成的二进制的十进制数/2。例如byte的范围则是11111111转十进制后除以2取反,即-127~128。范围绝对值之和为256。...1,更一般的,一个r进制数的的位权取值是一个大于0小于r-1的数,r进制数转换为10进制的计算公式如下: $$\sum_{i=0}^{-m}K_i*r^i$$ 在C#中,表示一个二进制通常用Ob开头,8...正负数存储形式及四种码 在计算机中,数据往往并不是直接以数值本身的二进制码(机器数)进行存储和计算的,我们往往需要对数值的二进制码进行一些变换。...例如真值1,进行移位$2^4$得到了17,转换成为补码形式就是10001。...计算题 求123.6875的二进制、八进制、十六进制表达式。 求$(11011.101)_2$二进制小数转换为十进制。

    1.6K30

    数据在内存中的存储

    反码,补码 有符号的整数均由符号位和数值位构成,符号位为‘0’表示正,用1表示负,最高位被当作为符号位,剩余的位数为数值位。...敲重点: 正数的原码,反码,补码都相同。 负整数的原码,反码,补码表示方法各不相同。 负整数转换方法 原码:  直接将数值按照正负的形式翻译成二进制得到的就是原码。...反码:  将原码的符号位不变,剩余的按位取反(0转换为1,1转换为0) 补码:  将反码+1得到就是补码。 补码得到原码同样也是:先按位取反,后加1。...数据存储在计算机内存中,存储的是整数的补码 为啥? 在计算机系统中,数值一律用补码来表示和存储的。...),由于寄存器的宽度大于一个字节,那么必然存在一个如何将多个字节安排的问题。

    59910

    无符号数和有符号数

    无符号数 十进制——>R进制(整数部分小数部分分开转化,取到的第一个余或第一个整最接近小数点) 将十进制的217转化为二进制数(除基取余法) ?...所以转换结果为11011001 将十进制的0.6875转化为二进制数(乘基取整法) ? 转化结果为0.1011 所以217.6875转成二进制是多少你知道了吗?...R进制——>十进制(多项式代替法) 将二进制的10111.1101101转换为十进制 ? 有符号数 对与有符号数来说,我们更喜欢谈并且才能谈这三个:原码、反码和补码。...原码:符号位用0表示正1表示负,数值位与真值一样 反码:符号位用0表示正1表示负,正数时数值位还是真值,负数时数值位是真值的按位取反 补码:符号位用0表示正1表示负,整数补码的数值位和真值相同,负数补码的数值位是真值的按位取反...小技巧: X的补码符号位连同数值位变反加一就可以得到-X的补码 对与反码、补码来说,扩展的数据位的值和原来的符号位的值是一样的

    4K20

    【C语言篇】数据在内存中的存储(超详细)

    数据在内存中的存储 二进制和进制转换 其实我们经常能听到 2进制、8进制、10进制、16进制 这样的讲法,那是什么意思呢? 其实2进制、8进制、10进制、16进制是数值的不同表⽰形式⽽已。...小数部分:乘二向下取余法 在计算机中我们关注更多的是整数部分的转换 二进制转八进制和十六进制 二进制转八进制 8进制的数字每⼀位是0~7的数字,各⾃写成2进制,最多有3个2进制位就⾜够了,⽐如7的...反码原码补码 整数的2进制表⽰⽅法有三种,即原码、反码和补码 无符号整数就是所有二进制位都用来表示数值 有符号整数的三种表⽰⽅法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号位,剩余的都是数值位...正数:原码反码补码都相同 例如:3的原反补码都是00000011 负数,规则如下 原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。...型(要看具体的编译器), 另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。

    91110

    【进阶】C语言——深度剖析数据在内存中的存储

    三种表示方法均有符号位和数值位两部分,符号位都是用0表示==“正”,用1表示“负”==,而数值位 正数的原、反、补码都相同。 负整数的三种表示方法各不相同。...** 原码 ** 直接将数值按照正负数的形式翻译成二进制就可以得到原码。 反码 将原码的符号位不变,其他位依次按位取反就可以得到反码。 补码 反码+1就得到补码。...对于整形来说:数据存放内存中其实存放的是补码。 但是这是为什么呢? 在计算机系统中,数值一律用补码来表示和存储。...,那么必然存在着一个如何将多个字节安排的问题。...所以,表达式中各种长度可能小于int长度的整型值,都必须先转 换为int或unsigned int,然后才能送入CPU去执行运算。 练习1: 下列程序会输出什么?

    88420

    【愚公系列】软考高级-架构设计师 003-进制的转换

    十进制转八进制或十六进制:可以先将十进制数转换为二进制数,然后再从二进制转换为八进制或十六进制。或者直接通过除基取余法,类似于十进制转二进制的方法,但是这次除以8或16。...计算负数的补码要得到一个负数的补码表示,可以通过以下两种方法之一:将该数的正值取二进制形式,然后通过取反加1得到负数的补码。...直接从该负数的绝对值的二进制形式出发,从右向左数,保留第一个1及其右边的所有位不变,然后将左边的所有位取反。...补码的数值范围对于n位的二进制补码表示:最小值是-2^(n-1),用一个1后跟n-1个0的补码表示。最大正值是2^(n-1) - 1,用0后跟n-1个1的补码表示。...$十进制小数转二进制十进制小数转换为二进制小数的常用方法是乘2取整法,即将小数部分乘以2,取结果的整数部分作为二进制表示中的下一位,然后再取结果的小数部分继续乘以2,重复此过程直到小数部分为0或达到所需的精度

    1.4K11

    计算机组成原理-计数制与定点数编码

    进位计数制 r进制转10进制 设r进制数从左到右分别为 R(n) R(n-1) R(n-2) … R(1) R(0),则该进制数转换为十进制是 R(n)×r^n + R(n-1)×r^(n-1) + ........ 0 2 ÷ 2 = 1 ...... 0 1 ÷ 2 = 0 ...... 1 因此最后结果是 10011 小数转换 r进制转10进制时,小数部分继续按照上面的公式计算即可,如二进制下的...0.1 转换成10进制是 0.1 × 2^(-1) = 0.5 十进制转r进制时,不断地将小数部分乘上r,并取整数部分,例如将 0.123 转换为 8 进制 0.123 × 8 = 0.984 0.984...无符号数 无符号数是指整个字长的全部二进制位均为数值,而非符号。...只需要将整个补码看作一个二进制数,然后连同符号位一起相加(无论是加法还是减法都是相加),最终得到的就是计算结果的补码 移码 移码只能用来表示整数,只需要把补码的符号位取反就能得到移码 移码的好处在于能够使用硬件快速比较大小

    1.7K50

    解析二进制文件的工具方法

    目录 1 一个字节范围 2 >> 的含义 3 十进制的负数变成二进制 4 0x1 代表什么意思 5字节组转list 6 list转字节组 7 截取bytes 1 一个字节范围 1个字节,取值范围是-128...正数的最大补码:01111111,即127.负数的最大补码10000000,原码为100000000,即进了一位变成了-128 01111111 为127 2 >> 的含义 是一个“有符号...负数转换为二进制,就是将其相反数(正数)的补码的每一位变反(1变0,0变1)最后将变完了的数值加1,就完成了负数的补码运算。...11 >>2(11为int型) 1)、11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011 2)、把低位的最后两个数字移出,因为该数字是正数,所以在高位补零...4)、转换为十进制是3。

    1.7K40

    数据在内存中的存储

    1.整数在内存中的储存         在整个计算机系统,整数在内存中是以二进制的形式进行存储和运用,但是整数的二进制又有三种表达形式: 即原码、反码、补码。...①原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码 ②反码:将原码的符号位不变,其他位依次按位取反就可以得到反码 ③补码:反码+1就得到补码。...另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。...%d 的输出逻辑:      %d 的作用是将内存中以补码存储的二进制数,解释为有符号整数,并直接转换为对应的十进制值。 它的工作流程是:读取内存中补码的二进制位。...• 小数部分转换:使用乘 2 取整法将小数 0.25 转换为二进制。

    24010

    C语言——关于整数和浮点数在内存中存储

    1.整数在内除中的存储 整数二进制有三种表示方法,即 原码,反码,补码,三种表示方法均有符号位和数值位俩部分,符号位用0来表示正,1来表示负3,数值位最高位表示符号位,其他表示数值位。...正整数的原码反码补码都相同 负整数的三种表示方法都不同 原码 直接转换为二进制位就是原码 反码 符号位不变,其他位取反加一 补码 反码加1就是补码  对于整数来说存储的就是二进制的补码 2.大小端字节序和字节序判断...大端模式:简单来说,就是低字节存储在内存地址高处,而高字节存储在内存地址低处 小端模式:也就是数据中的低字节存储在内存中的低处,高字节存储在内存中的高处 那么,该如何判断大小端呢?...浮点数在内存中的存储 根据国际标准IEEE745(电气与电子工程协会),任意的一个二进制浮点数V都可以写成下面的形式 举例来说: 十进制的5.0转换为二进制就是101.0,科学计数法就是1.01*2^2...,那么,按照上面V的形式就可以得出S=0,M=1.01,E=2。

    32510

    江哥带你玩转C语言 | 09 - C语言进制和位运算

    进制是一种计数的方式,数值的表示形式 常见的进制 十进制、二进制、八进制、十六进制 进制书写的格式和规律 十进制 0、1、2、3、4、5、6、7、8、9 逢十进一 二进制 0、1 逢二进一 书写形式...例如: 将十进制(97) 10转换为二进制数 ---- 2 进制转 10 进制 每一位二进制进制位的值 * 2的当前索引次幂; 再将所有位求出的值相加 例如: 将二进制01100100转换为十进制...整数部分,直接转换为二进制即可 小数部分,使用"乘2取整,顺序排列" 用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,直到积中的小数部分为零,或者达到所要求的精度为止 然后把取出的整数部分按顺序排列起来..., 即是小数部分二进制 最后将整数部分的二进制和小数部分的二进制合并起来, 即是一个二进制小数 例如: 将12.125转换为二进制 // 整数部分(除2取余) 12 / 2 ------ 6...计算机只能识别0和1, 所以计算机中存储的数据都是以0和1的形式存储的 数据在计算机内部是以补码的形式储存的, 所有数据的运算都是以补码进行的 正数的原码、反码和补码 正数的原码、反码和补码都是它的二进制

    1.9K00

    【C数据存储】整型在内存中的存储(进阶版)

    : 对于负数求原反补 原码:有符号数,直接根据正负数值位出二进制序列就是原码 反码:原码的符号位不变,其他位按位取反 补码:反码二进制的最低位+1得到 正数的原反补相同 将十进制转换为二进制的求原码技巧...: 写成两个2的整数次方相加的形式,比如10=8+2 也就是1000+0010=1010 总体来看: 只要是整数,在内存中的都是以补码的形式存储 举个例子: unsigned int a=...0000 0000 0000 到 1111 1111 1111 1111 1111 1111 1111 1111 1111 也就是0到255 补码转原码的小技巧: 3.大小端字节序(顺序)...这也类似我们的大小端字节序 为什么有大小端字节序 由上面数据以二进制补码的形式存储在内存中,如果现有一个十六进制数0x112223344,我们知道电脑内存被划分为一个个聂村单元,每一个内存单元就是一个字节...: 1111 1111 1111 1111 1111 1111 1111 1111 0110 最高位是1,为负数,要进行补转原,数值位取反,再加1): 数值位取反: 1000 0000 0000

    1.5K50

    深入解析数据在内存中的存储 - 大小端字节序和字节序判断(百度笔试题)

    一、整数在内存中的存储 在写操作符的时候这部分就写过一些: 常用操作符,操作符相关笔试题(谷歌)及算法的优化 整数的二进制表示方法有3中,即原码、反码和补码 有符号的整数,三种表示方法均有符号位和数值位两部分...补充:无符号数无符号位 正整数的原、反、补码都相同。 负整数的三种表示方法各不相同。 原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。...在计算机系统中,数值(整数)一律用补码来表示和存储。 原因在于,使用补码,可以将符号位和数值域统一处理(统一参与运算)。...),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题,因此就导致了大端存储模式和小端存储模式。...为什么是22可以参考下面十进制数的科学计数法写法: 小数点后二进制的含义分别是2-1,2-2,… 所以9.5按照V的写法就是下图 还有一种情况就是5.2转为二进制的过程中

    18310
    领券