CSAPP 2-2 整数的表示和运算
目录
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 整数的表示和运算的更多相关文章
- C语言的本质(3)——整数的本质与运算
C语言的本质(3)--整数的本质与运算 计算机存储的最小单位是字节(Byte),一个字节通常是8个bit.C语言规定char型占一个字节的存储空间.如果这8个bit按无符号整数来解释,则取值范围是0~ ...
- Linux上整数和浮点数的运算
一:shell中对整数和浮点数的运算 常用的运算符号 加法+ 减法 - 乘法* 除法/ 求余% += -= ...
- Java 整数间的除法运算如何保留所有小数位?
1.情景展示 double d = 1/10; System.out.println(d); 返回的结果居然是0.0!这是怎么回事儿? 2.原因分析 第一步:你会发现用运算结果也可以用int类型接 ...
- 九度OJ 1190:大整数排序 (大数运算、排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3219 解决:1467 题目描述: 对N个长度最长可达到1000的数进行排序. 输入: 输入第一行为一个整数N,(1<=N<=1 ...
- 小米oj 反向位整数(简单位运算)
反向位整数 序号:#30难度:一般时间限制:1000ms内存限制:10M 描述 输入32位无符号整数,输出它的反向位. 例,输入4626149(以二进制表示为00000000010001101001 ...
- 牛客网-《剑指offer》-数值的整数次方[快速幂运算]
题目:http://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00 /** * 1.全面考察指数的正负.底数是否为零等情况. ...
- HDU 1212 大整数的取模运算
因为这里是MOD最大为100000 所以我将字符串看作5个一组,并记录后面跟了多少个100000 每次取5个数根据其数据进行取模更新 注意过程中 100000*100000会超int #include ...
- 大整数加减运算的C语言实现
目录 大整数加减运算的C语言实现 一. 问题提出 二. 代码实现 三. 效果验证 大整数加减运算的C语言实现 标签: 大整数加减 C 一. 问题提出 培训老师给出一个题目:用C语言实现一个大整数计算器 ...
- Java编程的逻辑 (4) - 整数的二进制表示与位运算
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
随机推荐
- 更改Android设备System目录的文件的写入权限
有时候我们需要修改/system目录中文件的权限,比如将该目录下的脚本设置写入权限等,但该目录默认只有read权限,此时应该怎么办? 1.安卓设备请确保root;2.连接安卓设备,确保安卓设备打开了“ ...
- 报错解决 unable to unroll loop, loop does not appear to terminate in a timely manner (994 iterations) or unrolled loop is too large, use the [unroll(n)] attribute to force an exact higher number
在 Unity 写 Shader 的时候,在一个循环里面使用了 tex2D 函数,类似与下面这样: fixed2 center = fixed2(0.5,0.5); fixed2 uv = i.uv ...
- vue学习笔记(十)路由
前言 在上一篇博客vue学习笔记(九)vue-cli中的组件通信内容中,我们学习组件通信的相关内容和进行了一些组件通信的小练习,相信大家已经掌握了vue-cli中的组件通信,而本篇博客将会带你更上一层 ...
- 事隔五年之后,开启第2版DSP数字信号处理和CMSIS-NN神经网络教程,同步开启三代示波器,前15章发布(2019-11-04)
说明:1.第1版DSP教程发布于2014年末,纪念下:https://www.cnblogs.com/armfly/p/11274826.html2.这几年在信号处理的应用上积累了一些经验,也发现了很 ...
- Fortify---Detail--Sql注入
Abstract: 在 PaperDao.java 的第 40 行,checkQuesUsed() 方法调用通过不可信来源的输入构建的 SQL 查询.通过这种调用,攻击者能够修改指令的含义或执行任 ...
- Image 鼠标拖拽与鼠标中键的缩放
一.Image在窗体上拖拽,势必会用到鼠标的三个事件(MouseDown,MouseUp,MouseMove),以左键为例,PictureBox为载体 Point mouseDownPoint = n ...
- C# -- 使用缓冲区进行文件下载操作
C# -- 使用缓冲区进行文件下载操作 1. 为避免下载超大文件占用内存资源,文件下载使用缓冲区,一点一点读取文件资源. string str0 = @"ftp://localhost:21 ...
- vue-cli3.0配置图片转base64的规则
vue-cli3.0发现打包的时候,一些小于10k的图片没有转base64,需要自己新建一个vue.config.js的文件(在根目录),然后进行如下配置,就可以控制图片转义规则 module.exp ...
- vue 无限滚动问题
如今web开发中,无限加载是必需的一项功能,尤其是在移动端开发中,一个列表往往默认只加载10条,想看更多只能逐渐往下翻页.那么今天就看看如何在Vue-Cli中实现这个功能. 当前找到两个插件 1 el ...
- Windows宏病毒利用
背景: 最近忙的飞起,各种事情,不想吐槽,因为某些事情,还吃了口屎,啧啧啧..... 常见的钓鱼,社工基本技术都是这种,什么鱼叉,水坑,社工,投毒之类的,APT 攻击惯用伎俩. 那么今天主要利用Win ...