🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥专栏: CSAPP笔记||书籍网课笔记
🔥温馨提示:划到文末发现专栏彩蛋
🔥本篇概览:计算机中的信息存储与表示全过程、无符号整数、有符号整数的加减乘除运算等
Computer system A Programmer's Perspective
Chapter 2:Representing and Manipulating Information
目录
3.Integer Representations I(整数表示 I)
3.Integer Representations II(整数表示 II)
Conversions between Signed and Unsigned
Expanding the Bit Representation of a Number
Detecting Overfow of Unsigned Addition
1. Information Storage I
Address
信息在计算机中如何存储?
通常情况下,程序将内存视为一个非常大的数组,元素是字节,每个字节都有一个唯一的数字来表示,称之为地址。而这些所有地址空间的集合就称之为虚拟地址空间。
Word size
字长决定了虚拟地址空间的最大值为多少。如字长为W,则虚拟地址空间字长的范围是0—2^W-1
计算机位数(机器字长)=字长=寄存器或运算器位数=CPU位数。
计算机位数通常是指计算机中处理器一次可以处理的数据位数,也就是处理器的字长。它是衡量计算机性能的重要指标之一,常见的有 32 位和 64 位。 字长是指计算机一次能够处理的二进制位数,它通常等于处理器的位数。 寄存器或运算器位数是指计算机中寄存器或运算器能够处理的二进制位数,它通常等于处理器的位数。 CPU 位数是指 CPU 一次能够处理的二进制位数,它通常等于处理器的位数。 总之,这些术语通常都指的是计算机中处理器一次可以处理的数据位数,也就是处理器的字长。
字:表示被处理信息的单位,用来度量数据类型的宽度。因此字的位数并不是确定值,如x86机器将字定义为16位(汇编语言课程中),也就是两个字节,在32位arm机器中,字定义为32位(嵌入式课程中)。
操作系统位数:操作系统可寻址位数(小于等于CPU位数)。
32-bit and 64-bit Program
对于32位机器、64位机器,主要区别在于程序是如何编译的,而不是运行机器的类型。
而且只能向前兼容,不能像后兼容
Addressing and Byte Ordering
例如下面的int类型数据0x01234567,在大端法与小端法中的存储样式。
大端开头
很多新的处理器支持双端法,可以配置两者之一,Android和IOS只支持小端法。
Byte Print Program
其中的show_bytes((byte_pointer)&x,sizeof(x));中的byte_pointer告诉指针应该把这个x看成指向一个字节的序列,而不是原来的数据类型
程序打印结果:
指针的值打印结果:
不同机器的操作系统分配的内存地址不同,所以指针的值是完全不同的,
如下:
Int&float type
虽然整数于浮点相等,但是他们却有着完全不一致的编码模式
如下:
这里观察规律得知中间有一个十三位的位匹配,会在浮点数一章节详解
2. Information Storage II
Representing Strings
字符串表示
只要用ASCII码表示,就在任何平台上都是一样的,因此文本数据二进制数据具有更强的平台独立性
Shift Operation in C
注意算术右移补0或1是与最高位是为0还是1相关的
具体例子如下:
实际上,所有编译器对于有符号数使用的右移方式都是算术右移,由于无符号数使用的是逻辑右移。
3.Integer Representations I(整数表示 I)
首先我们来看看计算机是如何对无符号数进行编码的
Unsigned Encoding
位向量对无符号数的编码方式
图形化表示
Signed Encoding
看出来第一位是-2,所以也称为符号位。对于符号位注意这里应该利用权重来理解,利用下面的图解:
无符号数表示范围
有符号数表示范围
正数
负数
对于-1,要特别注意,不管是多少位都是全为1
3.Integer Representations II(整数表示 II)
Conversions between Signed and Unsigned
计算机系统中对有符号数与无符号数的转化规则是,位模式不变,但是解释这些位的方式发生了改变
两者之间的转化记住这个关系即可,有符号数前面为-2,只在最高位之差别
记住:相同位情况下,无符号数比有符号数大
Signed versus Unsigned in C
当有符号数与无符号数进行比较时,C语言中会将有符号数转化为无符号数。常常出现错误。
Expanding the Bit Representation of a Number
小转大
不同大小数据类型的转化
大转小
将高位剩出来的直接丢弃
4. Integer Arithmetic(整数运算)
unsigned addiction
上式发生溢出,故为0
过程分析
Detecting Overfow of Unsigned Addition
C语言中判断溢出与否代码
Unsigned Multiplication
截断运算——要想截断多少位就取多少的进制下的位数的幂
Multiplying by Constants
乘法或者除法直接用移位操作以及加法或者减法来代替
乘法如下
除法如下
先看将无符号数除以2^k的移位操作。其余与乘法类似,拆分即可
5. Floating Point(浮点数)
Fractional Binary Numbers
小数二进制表示法
浮点数在数学上具备一套与之前全然不同的标准规格化表示,比较复杂,跳过
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
热门专栏推荐
🌈🌈计算机科学入门系列 关注走一波💕💕
🌈🌈CSAPP深入理解计算机原理 关注走一波💕💕
🌈🌈微服务项目之黑马头条 关注走一波💕💕
🌈🌈redis深度项目之黑马点评 关注走一波💕💕
🌈🌈Java面试八股文系列专栏 关注走一波💕💕
🌈🌈算法leetcode+剑指offer 关注走一波💕💕
总栏
🌈🌈JAVA后端技术栈 关注走一波💕💕
🌈🌈JAVA面试八股文 关注走一波💕💕
🌈🌈JAVA项目(含源码深度剖析) 关注走一波💕💕
🌈🌈计算机四件套 关注走一波💕💕
🌈🌈算法 关注走一波💕💕
🌈🌈必知必会工具集 关注走一波💕💕
🌈🌈书籍网课笔记汇总 关注走一波💕💕
🌈🌈考试复习资料 关注走一波💕💕
🌈🌈C/C++技术栈 关注走一波💕💕
🌈🌈GO技术栈 关注走一波💕💕
分栏
🌈🌈JAVA后端技术栈
🌈🌈spring 关注走一波💕💕
🌈🌈redis 关注走一波💕💕
🌈🌈MySQL 关注走一波💕💕
🌈🌈mybatis 关注走一波💕💕
🌈🌈mybatisplus 关注走一波💕💕
🌈🌈MQ 关注走一波💕💕
🌈🌈微服务 关注走一波💕💕
🌈🌈设计模式 关注走一波💕💕
🌈🌈分布式锁 关注走一波💕💕
🌈🌈JAVA八股文JAVA面试八股文(redis、MySQL、框架、微服务、MQ、JVM、设计模式、并发编程、JAVA集合、常见技术场景) 关注走一波💕💕
🌈🌈JAVA项目(含源码深度剖析)
🌈🌈黑马头条(微服务) 关注走一波💕💕
🌈🌈黑马点评(redis) 关注走一波💕💕
🌈🌈计算机四件套
🌈🌈计算机基础 关注走一波💕💕
🌈🌈计算机基础 关注走一波💕💕
🌈🌈计算机网络 关注走一波💕💕
🌈🌈数据结构与算法 关注走一波💕💕
🌈🌈算法
🌈🌈leetcode 关注走一波💕💕
🌈🌈剑指offer 关注走一波💕💕
🌈🌈必知必会工具集 关注走一波💕💕
🌈🌈书籍网课笔记汇总
🌈🌈CSAPP笔记 关注走一波💕💕
🌈🌈计算机科学速成课 关注走一波💕💕
🌈🌈CS自学指南 关注走一波💕💕
🌈🌈读书笔记与每日记录 关注走一波💕💕
🌈🌈考试复习资料 关注走一波💕💕
🌈🌈C/C++技术栈 关注走一波💕💕
🌈🌈GO技术栈 关注走一波💕💕
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!