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

本文介绍了计算机系统中存储和运算的基础知识,包括进制转换、大端小端存储、有符号数和无符号数的概念。通过实例解释了补码表示法,探讨了C语言中的二进制运算,并讨论了在不同场景下如何处理存储和运算中的溢出问题。此外,文章还提到了有符数和无符数的转换以及加法、乘法运算的溢出处理,旨在帮助读者更好地理解计算机底层工作原理。
摘要由CSDN通过智能技术生成

最近补基础知识,把一些内容通过博客记录下来,以便今后参考 ——幸亏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++

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值