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表示用有符号十进制、无符号十进制和十六进制格式输出一个数字.

未完待续...

CSAPP 2-2 整数的表示和运算的更多相关文章

  1. C语言的本质(3)——整数的本质与运算

    C语言的本质(3)--整数的本质与运算 计算机存储的最小单位是字节(Byte),一个字节通常是8个bit.C语言规定char型占一个字节的存储空间.如果这8个bit按无符号整数来解释,则取值范围是0~ ...

  2. Linux上整数和浮点数的运算

    一:shell中对整数和浮点数的运算     常用的运算符号         加法+    减法 -     乘法*     除法/     求余%              +=        -= ...

  3. Java 整数间的除法运算如何保留所有小数位?

      1.情景展示 double d = 1/10; System.out.println(d); 返回的结果居然是0.0!这是怎么回事儿? 2.原因分析 第一步:你会发现用运算结果也可以用int类型接 ...

  4. 九度OJ 1190:大整数排序 (大数运算、排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3219 解决:1467 题目描述: 对N个长度最长可达到1000的数进行排序. 输入: 输入第一行为一个整数N,(1<=N<=1 ...

  5. 小米oj 反向位整数(简单位运算)

     反向位整数 序号:#30难度:一般时间限制:1000ms内存限制:10M 描述 输入32位无符号整数,输出它的反向位. 例,输入4626149(以二进制表示为00000000010001101001 ...

  6. 牛客网-《剑指offer》-数值的整数次方[快速幂运算]

    题目:http://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00 /**  * 1.全面考察指数的正负.底数是否为零等情况.   ...

  7. HDU 1212 大整数的取模运算

    因为这里是MOD最大为100000 所以我将字符串看作5个一组,并记录后面跟了多少个100000 每次取5个数根据其数据进行取模更新 注意过程中 100000*100000会超int #include ...

  8. 大整数加减运算的C语言实现

    目录 大整数加减运算的C语言实现 一. 问题提出 二. 代码实现 三. 效果验证 大整数加减运算的C语言实现 标签: 大整数加减 C 一. 问题提出 培训老师给出一个题目:用C语言实现一个大整数计算器 ...

  9. Java编程的逻辑 (4) - 整数的二进制表示与位运算

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

随机推荐

  1. inux 内存监控分析

    一.free 查看系统总的内存情况 第一部分Mem行: total 内存总数: 3768M used 已经使用的内存数: 3136M free 空闲的内存数: 632M shared 当前已经废弃不用 ...

  2. VS2019 开发Django(五)------createsuperuser

    导航:VS2019开发Django系列 上篇我们已经把LazyOrders中用到的C#的实体转成了Django中的Entity,并且已经迁移数据库成功,那么,今天继续介绍Django中内置的数据库操作 ...

  3. ReactNative: 使用网页组件WebView组件

    一.简介 在移动端开发中,很多时候需要嵌入一个网页来帮助实现某一个活动,这方式大大提高了活动快速迭代的灵活性,在RN中,同样也这么处理这种情况的.其实,这种混合式开发称为Hybird APP,它们就是 ...

  4. SpringBoot应用篇(二):SpringSecurity实现带验证码的登录认证 附代码

    一.文章简介 本文简要介绍了spring security的基本原理和实现,并基于springboot整合了spring security实现了基于数据库管理的用户的登录和登出,登录过程实现了验证码的 ...

  5. SAP FI 问题汇总

    记录工作中遇到的问题汇总 1.固定资产折旧码的设置 2.与资产有关的日期 3.如何添加固定资产分类

  6. Abp zero 登录 添加腾讯云验证码

    腾讯云验证码是为网页.App.小程序开发者提供的安全验证服务,基于腾讯多年的大数据积累和人工智能决策引擎,构建智能分级验证模型,最大程度保护业务安全的同时,提供更精细化的用户体验. 腾讯云--> ...

  7. Saltstack_使用指南09_远程执行-编写执行模块

    1. 主机规划 salt 版本 [root@salt100 ~]# salt --version salt (Oxygen) [root@salt100 ~]# salt-minion --versi ...

  8. maven配置多个镜像

    问题场景 1.国内访问maven默认远程中央镜像特别慢 2.用阿里的镜像替代远程中央镜像 3.大部分jar包都可以在阿里镜像中找到,部分jar包在阿里镜像中没有,需要单独配置镜像 解决方案 setti ...

  9. log file sync等待超高案例浅析

    监控工具DPA发现海外一台Oracle数据库服务器DB Commit Time指标告警,超过红色告警线(40毫秒左右,黄色告警是10毫秒,红色告警线是20毫秒),如下截图所示,生成了对应的时段的AWR ...

  10. docker容器虚拟化技术

    简单来说,在Windows系统下安装各种运行环境的坑简直不要太多了(● ̄(エ) ̄●),并不仅限于docker.Nginx.PHP.Python等等,我会尽详细写出实际过程中遇到的各种各样的奇葩问题 1 ...