《深入理解计算机系统》2.2整数表示

整数数据类型

C语言中不同字长的机器和编译器会分配不同字节大小.
long类型是唯一与机器相关的.

32位机器上C语言的整数数据类型的典型取值范围
负数的取值范围比正数大1

C data type Minimum Maximum
char ?128 127
unsigned char 0 255
short [ int ] ?32,768 32,767
unsigned short [ int ] 0 65,535
int ?2,147,483,648 2,147,483,647
unsigned [ int ] 0 4,294,967,295
long [ int ] ?2,147,483,648 2,147,483,647
unsigned long [ int ] 0 4,294,967,295
long long [ int ] ?9,223,372,036,854,775,808 9,223,372,036,854,775,807
unsigned long long [ int ] 0 18,446,744,073,709,551,615

64位机器上C语言的整数数据类型的典型取值范围
负数的取值范围比正数大1

C data type Minimum Maximum
char ?128 127
unsigned char 0 255
short [ int ] ?32,768 32,767
unsigned short [ int ] 0 65,535
int ?2,147,483,648 2,147,483,647
unsigned [ int ] 0 4,294,967,295
long [ int ] ?9,223,372,036,854,775,808 9,223,372,036,854,775,807
unsigned long [ int ] 0 18,446,744,073,709,551,615
long long [ int ] ?9,223,372,036,854,775,808 9,223,372,036,854,775,807
unsigned long long [ int ] 0 18,446,744,073,709,551,615

C语言的整数数据类型的保证的取值范围
取值范围是对称的

C data type Minimum Maximum
char ?128 127
unsigned char 0 255
short [ int ] ?32,767 32,767
unsigned short [ int ] 0 65,535
int ?32,767 32,767
unsigned [ int ] 0 65,535
long [ int ] ?2,147,483,647 2,147,483,647
unsigned long [ int ] 0 4,294,967,295
long long [ int ] ?9,223,372,036,854,775,807 9,223,372,036,854,775,807
unsigned long long [ int ] 0 18,446,744,073,709,551,615

补充:C/C++支持有符号和无符号,Java只支持有符号

无符号数的编码




B2Uw(x)

函数把一个位向量变成10进制数

无符号数的最大值为:

所以无符号的取值范围是

补码编码

计算机表示负数通常是补码形式




B2Tw(x)

把一个有符号的二进制装换成10进制

一个二进制除了符号位把剩下的位取反得到反码,再在末尾+1,得到补码
比如:1011

  1. 除了符号位取反:1100
  2. 末尾+1:1101
  3. 符号数决定这个数字是负数,后三位决定这个数的绝对值大小为5
  4. 那么这个数为-5
    补码编码的取值范围为:

由于0是属于非复数的那么,表示正数的数就少了一个

机器数用补码表示的好处:

原码简单,适用于乘除运算,但用原码表示的数进行加减法运算比较复杂。
补码,减法运算可以用加法来实现,例如 [X-Y]补 = [X]补 +[-Y]补,
而且,数的符号位也可以参与运算,便于运算结果的正负及是否溢出判断。
因此在计算机中大都采用补码来进行加减及乘除运算。
(不仅是整数,小数亦可用补码表示)

确定大小的整数类型

有某个确定大小的表现编码据类型非常重要
例如
让数据类型与协议指定的数据类型兼容是非常重要的

Java要求补码表示,取值与《64位机器上C语言的整数数据类型的典型取值范围 》一样。单字节用byte,没有long long。

反码与补码

反码公式

补码公式

有符号与无符号间的转换

C语言中将short int 转换成unsight short,会改变数值而不改变位模式
比如
-12345(补码) 二进制:1100 1111 1100 0111
转换成无符号
53191(无符号) 二进制:1100 1111 1100 0111

有符号转换无符号

无符号装换有符号

总的来说对于w位的数字

  • 有符号变无符号

    • 正数不变
    • 负数会加上2^w
  • 无符号变有符号
    • 如果数字小于2^(w-1),不变
    • 如果数字大于2^(w-1),减2^w

运算时,运算符两边如果一个是有符号数,一个是无符号数,那么有符号数会自定转换成无符号.这种转换在逻辑运算中将显得不直观

扩展一个数字的位表示

  • 将一个无符号的数转换成一个跟大范围的数据类型,只要在开头加0,这种运算叫零扩展
  • 将补码数字扩展一个更大范围的数据类型,只要在前面添加最高有效位的值的副本,即最高位为0就添0为1就添1.
    • 比如1010 四位的数字扩展到6位就是111010
  • 对于将short类型数字变成unsigned int 时,先改变大小再从有符号变成无符号

截断数字


无符号数如果经过运算变成负数,在计算机中会被认为是一个很大的无符号数.这种特性可能成为计算机的安全隐患.为了防止这种问题,绝不使用无符号

来自为知笔记(Wiz)

时间: 2024-08-01 10:33:42

《深入理解计算机系统》2.2整数表示的相关文章

深入理解计算机系统PDF下载

深入理解计算机系统PDF下载 我们这些程序员提升发展的书籍,本人亲自拜读过这本书,内容新颖,仿佛打开了我的另一扇大门,读完获益匪浅,所以拿出来跟老铁们一起分享!!! 链接:https://pan.baidu.com/s/1rVB4BD7USTHN9zfFem7Bww 提取码:n4be 目录 · · · · · · 出版者的话 中文版序一 中文版序二 译者序 前言 关于作者 第1章 计算机系统漫游1 1.1 信息就是位+上下文1 1.2 程序被其他程序翻译成不同的格式3 1.3 了解编译系统如何工

深入理解计算机系统9个重点笔记

引言 深入理解计算机系统,对我来说是部大块头.说实话,我没有从头到尾完完整整的全部看完,而是选择性的看了一些我自认为重要的或感兴趣的章节,也从中获益良多,看清楚了计算机系统的一些本质东西或原理性的内容,这对每个想要深入学习编程的程序员来说都是至关重要的.只有很好的理解了系统到底是如何运行我们代码的,我们才能针对系统的特点写出高质量.高效率的代码来.这本书我以后还需要多研究几遍,今天就先总结下书中我已学到的几点知识. 重点笔记 编写高效的程序需要下面几类活动: 选择一组合适的算法和数据结构.这是很

读书笔记《深入理解计算机系统》(第三版) 概述

<深入理解计算机系统>第三版刚出来不到一周,便买下了这本书:之所以阅读本书,一方面源于网友推荐以及豆瓣不错的评分.评价:另一方面是针对本人非科班出身,计算机系统相关的知识相对比较薄弱,很多情况下此类知识需要工作之外的时间自学.补涨此类知识,而该书从程序员的角度进行阐述.展示了计算机系统的各个层面的知识以及其影响程序的正确性.性能.实用性,更容易引起某些上层和下层的知识接轨理解,以期望可以融汇各方面的知识. 明白程序的运作过程,编写更好的软件程序,对底层过程了解以完善自己知识体系和提高信心.接下

《深入理解计算机系统》 Chapter 7 读书笔记

<深入理解计算机系统>Chapter 7 读书笔记 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(货被拷贝)到存储器并执行. 链接的时机 编译时,也就是在源代码被翻译成机器代码时 加载时,也就是在程序被加载器加载到存储器并执行时 运行时,由应用程序执行 链接器使分离编译称为可能. 一.编译器驱动程序 大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器.编译器.汇编器和链接器. 1.将示例程序从ASCⅡ码源文件翻译成可执行目标文件的步骤 (1)运

【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才表现出来.前几天线上模块因堆内存写越界1个字节引起各种诡异崩溃,定位问题过程中的折腾仍历历在目,今天读到<深入理解计算机系统>第9章-虚拟存储器,发现书中总结了C程序中常见的内存操作有

《深入理解计算机系统》第六周学习笔记

第四章 处理器体系结构 (一)知识点总结 一.Y86指令集体系结构 1.Y86处理器状态类似于IA32,有8个程序寄存器: %eax.%ecx.%edx.%ebx.%esi.%edi.%esp.%ebp.处理器的每个程序寄存器存储一个字.%esp被入栈.出栈.调用和返回指令作为栈指针. 2.3个一位的条件吗:ZF.SF.OF,它们保存最近的算术或逻辑指令所造成影响的有关信息.程序计数器PC存放当前正在执行指令的地址. 3.程序状态的最后一个部分是状态码stat,它表明程序执行的总体状态 4.Y8

深入理解计算机系统(4.2)---硬件的魅力

引言 这个系列已经很久没更新了,记得上一篇博文已经是三月份了,实在是抱歉.最近业余时间没有以前充裕了,因此更新一篇博文已经变成了一种奢侈.记得以前刚开始写的时候,最多的时候LZ一天写过3篇博文,现在想想,往事如梦. 好了,好不容易写一次,就不多说废话了,本文主要介绍一下硬件以及HCL语言的内容. 从疑问开始 首先,在介绍本文的内容之前,我们先来思考一个看似简单,却实际比较“高深”的问题.众所周知,计算机归根结底是在和0.1打交道,那么到底0和1是如何被计算机记住的呢? 怎么样,这个问题是不是有点

深入理解计算机系统读书笔记一 ---&gt; 计算机基础漫游

一.程序编译的不同阶段. 通常我们是以高级程序开发易于阅读的代码,我们通过语法规则推断代码的具体含义.但是计算机执行代码的时候就需要把代码解析成既定的可执行问题,计算机是如何处理的呢?这里以C语言hello.c文件为例来说明中间过程. #include <stdio.h> int main() { printf("hello world!\n"); } 先上张图. C语言源程序----预处理解析头文件和函数  --- 编译器解析成汇编语言 ---   翻译机器语言指令,打包

深入理解计算机系统(3)

深入理解计算机系统(3) 本文我们主要讲关于数据的的表示方式:原码,反码和补码. 本文在写作过程中,参考了园中的这篇文章<原码,反码,补码详解>,特此声明. 一原码 计算机中是使用二进制来表示数据的,对于C语言这样的强类型语言,每一个数值类型,都有其范围,例如一个int类型,在32位机器上,其表示的范围如下: 最小值 最大值 有符号整数 -2147483648 217483647 无符号整数 0 4294967295 而如果我们定义了一个int类型,给其的赋值,超出了这个范围,则会出现问题.一

20135302魏静静——《深入理解计算机系统》第7章 学习笔记

<深入理解计算机系统>第7章   链接 本章主要内容: 链接——静态链接.动态链接(链接又包括两个主要任务:符号解析和重定位) 符号——全局符号和本地符号.符号表.符号解析 链接文件的创建及引用——gcc.ar rcs.sharedj及fPIC命令参数 重定位——重定位条目.重定位符号引用(PC相对引用和绝对引用) 目标文件——可重定位目标文件(其中又详细介绍了ELF可重定位文件的结构及格式).可执行目标文件.共享目标文件 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一