《C 和指针》[14]一书提到,C 语言中仅有四种数据类型,分别为整型、浮点型、指针型和聚合类型(包含数组和结构体),剩下的类型都是从这四种类型派生或组合而来的。
例如字符型char 其实就是一个短整型,而字符串是用字符数组来保存和模拟的。本章我们主要说说整型和浮点型的相关问题。字符串、指针、数组和结构等主题,我将在本书的后面章节介绍。整型家族还分为有符号(signed)和无符号(unsigned)两种。整型数无论是否有符号,在计算机内部都是用补码来表示的。理解补码的表示方式有助于我们对整型数溢出的理解,所以先来介绍整型数的补码表示。
介绍补码之前,先简单介绍一下计算机内部使用的二进制。人类用十进制完全是因为我们有10 个手指头。如果有一天你看到一个外星人,它只有4 个手指头,那么他使用的一定是四进制,如图3-1 所示。
如果能看明白图3-1,说明你已经明白了进制和手指头的关系了。现代的计算机内部使用门电路,它们只能表示0 或者1 两个状态。如果计算机是一个人,那么他只有两个手指头,所以它使用二进制。所谓的进制,根本就不是什么神秘的东西。
图3-1 进制和手指头的关系
理解了计算机内部使用的二进制,下面来看看原码、反码和补码的官方定义。
• 原码: