C语言数据的存储及相关操作符

本文详细介绍了二进制的基本概念,包括二进制与十进制、八进制、十六进制的转换方法,以及整数的原码、反码和补码表示。此外,还涵盖了移位操作符、位操作符及其规则,有助于读者掌握基础的计算机数值系统和逻辑运算。
摘要由CSDN通过智能技术生成

1.数据的存储

1.二进制

1.二进制介绍

生活中我们常听到二进制,八进制,十进制,十六进制这样的讲法,具体是什么意思呢?其实二进制,八进制,十进制,十六进制是数值的不同表现形式而已

例如15的不同表示形式

接下来我们根据生十进制引出二进制的概念

十进制作为生活中最熟悉的数值表现形式,具有以下特征:

1.十进制中满10进1

2.十进制数字的每一位都是由0-9组成的

同理,二进制具有以下的特征:

1.二进制中满2进1

2.二进制数字的每一位都是由0-1组成的

例如1101就可以代表一个二进制数字

2.二进制和十进制的转化

十进制中123表示的值是一百二十三,但为什么是这个值呢?其实十进制的每一位都是有权重的,十进制从右向左依次是个位,十位,百位......,其权重依次是10^0,10^1,10^2......,如下图

二进制和十进制是类似的,只不过二进制每一位的权重,从右向左依次是2^0,2^1,2^2......,如果是二进制的1101该怎么理解呢?

从上图中我们了解了二进制转化为十进制,那么如何将十进制转化为二进制呢?

在十进制中我们通过n=n%10得到n的最后一位,在通过n=n/10一直循环直到n==0便可以得到n的每一位,二进制也是同样的道理

3.二进制转八进制

不难发现八进制的一个位是0~7的,一共有八种情况,相当于二进制的三个位(也有八种情况),因此二进制转八进制可以从二进制的右边低位开始向左取三个位转化为一个八进制位(若位数不够可以在最前面补0)

4.二进制转十六进制

同理十六进制的一个位是0~f的(a用来代表十进制的10,b用来代表十进制的11......f用来代表十进制的15),相当于二进制的四个位,因此二进制转十六进制可以从二进制的右边低位开始向左取四位转化为一个十六进制位(若位数不够可以在最前面补0)

2.原码,反码和补码

1.整数的二进制表示方法有三种,即原码,反码和补码

有符号整数的三种表示方法分为符号位和数值位两部分,二进制序列中,最高位的1位被当作符号位,剩余都是数值位

符号位用0表示正,1表示负

2.正数的原码,反码和补码都相同。

负数的三种表示方式各不相同

原码:直接将数值按照正负数的形式翻译成二进制的就是原码

反码:原码符号位不变,其他位按位取反得到的就是反码

补码:反码+1得到的就是补码

3.对于整型来说,数据存放在内存中的其实是补码

理由:

下图能更好的理解三者的关系

当我们以有符号整型%d打印时,补码的第一位是符号位,最后打印出来-1(注意printf打印出来的数字是原码)

当我们以无符号整型%u打印时,补码的第一位不是符号位,最后打印出来的数字就是补码(正数的原码和补码一样)的二进制数字转化而来的十进制数字

2.相关操作符

1.移位操作符

1.左移操作符<<

移位规则:左边抛弃,右边补0

2.右移操作符>>

移位规则:左边用该值的符号位填充,右边丢弃

2.位操作符

1.按位与&

两个数的二进制序列每一位当且仅当都为1时结果为1,反之为0

2.按位或|

两个数的二进制序列每一位至少有一个为1时结果为1,反之为0

3.按位异或^

两个数的二进制序列每一位相同时结果为0,反之为1

4.按位取反~

将一个数的二进制序列中的0变为1,1变为0

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值