加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

CSAPP 2-2 整数的表示和运算

发布时间:2020-12-15 07:45:05 所属栏目:Java 来源:网络整理
导读:目录 1 整数表示 1 整数表示 编码整数有2种方式: 一种只能表示非负数(大于0的数),另一种能够表示负数、零和正数. (1) 整型数据类型: C和C++都支持有符号(默认)和无符号数,Java只支持有符号数. (2) 无符号数的编码: 无符号数的二进制表示又一个很重要的属性:

目录

  • 1 整数表示

1 整数表示

编码整数有2种方式: 一种只能表示非负数(大于0的数),另一种能够表示负数、零和正数.

(1) 整型数据类型:

C和C++都支持有符号(默认)和无符号数,Java只支持有符号数.

(2) 无符号数的编码:

无符号数的二进制表示又一个很重要的属性:

每个介于 0 ~ 2^w - 1 之间的数都有唯一一个w位的值编码,反之亦然.

(3) 补码编码:

最常见的 有符号数 的计算机表示方式就是 补码(two‘s-complement) 形式: 字的最高有效位当作负权(negative weight),也就是符号位.

与无符号表示一样,在可表示的取值范围内的每个数字都由一个唯一的w位的补码编码 —— 补码编码的唯一性.

有2个注意的细节:

a) 补码的范围是不对称的: |TMin| = |Tmax| + 1,也就是TMin没有与之对应的正数. —— 一般的位模式表示负数(符号位是1的数),另一半表示非负数,而0是非负数,所以能表示的正数比负数少1个.

b) 最大的无符号数值刚好比补码的最大值的2倍大1: UMax = 2TMax + 1.

—— 还有一个注意点: 补码的-1和无符号的最大值UMax有同样的位表示 —— 一个全1的穿,而数值0在两种表示中都是全0的串.

C语言标准并没有要求要用补码形式来表示有符号整数,但是几乎所有的机器都是这么做的.
所以为了程序的可移植性,开发人员不要手动更改数值的表示范围,也不要假设有符号数会使用其他特殊的表示方式.

  • 扩展: 反汇编器是一种将可执行程序文件转换回可读性更好的ASCII码形式的程序. 这些文件包含许多十六进制的数字,都是用典型的补码形式来表示这些值.
    能够认识反汇编器生成的数字并理解它们的意义,是一项重要的技巧.

(4) 有符号数和无符号数之间的转换:

C语言允许在各种不同的数字数据类型之间做强制类型转换.

对大多数C语言的实现,处理同样字长的有符号数和无符号数之间相互转换的一般规则: 数值可能会改变,低层存储数值的位模式不会变.

(5) C语言中的有符号数和无符号数

大多数数字都默认是有符号的,要创建一个无符号数,必须加上后缀字符‘U’或者‘u’,例如: 12345U,或者0x1A2Bu.

C语言中,当用printf输出数值时,分别用指示符%对%u%x表示用有符号十进制、无符号十进制和十六进制格式输出一个数字.

未完待续...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读