带你学习《深入理解计算机系统》进制存储和运算(1)——有符数与无符数

最近补基础知识,把一些内容通过博客记录下来,以便今后参考 ——幸亏6年前写了博客,现在回忆真需要参考:)

 

 

            我们知道,计算机系统设计的一个目的,就是将存储空间划分为方便管理的单元。关于为什么用二进制和十六进制来处理数据也不用我多废话了,看下例子:   

    比如10进制23=2*10^1+3*10^0,那么16进制0x23=2*16^1+3*16^0=35

    如果是2进制,100011=1*2^5+1*2^1+1*2^0=35=0x23

    我们发现10对应2,而0011对应3,所以0x23很容易通过8421码写出其2进制形式。

 

 关于大端小端:

    这里就遇到个问题,假设有个int a;a有四个字节空间,假设其物理地址分别是

    0x00,

    0x01,

    0x02,

    0x03

    现在要存储0x12345678这个数,很明显,这个数确实需要四个字节的空间才能存下,那么到底是从上往下存,还是从下往上存呢?这里就涉及到大端(big endian)和小端(little endian)概念。

    如果按大端存法,从起始地址0x00开始存最高位字节12,然后地址按权位降低而往下递增;如果按小端存法,则刚好相反:低地址存低权位,高地址存高权位。

 

 

 

 

小端存法

地址标识

大端存法

78

0x00

12

56

0x01

34

34

0x02

56

12

0x03

78

 

    尽管从直觉上我们觉得貌似右边的存法更符合习惯,然而一般我们接触的系统环境,都是采取小端存法。

 

    按理说,如果为了更好的管理存储空间,那么某段存储空间所存储的类型应该是确定,这样在系统对数据进行理解时才不容易产生错误,因此大多数应用编程都不推荐对存储对象进行强制类型转换操作。然而,以C语言为例,对系统级编程、嵌入式编程方面,这种操作是必须的。比如,要验证所使用的系统环境是大端还是小端,可以使用如下方式进行验证:

 

      int a = 0x12345678;

      int i = 0;

      for(i=0; i<4; i++

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值