深入理解计算机系统学习(位扩展)

最近在复习计算机基础知识,断断续续的记录在这里吧。

深入理解计算机系统是本好书,对底层的实现原理从程序员的角度进行的细致的讲解,不愧为经典,深得大家的喜爱。

其中CPU对于有符号,无符号转化以及位的扩展引起的溢出问题需要理解,并在写c的时候避免,有时候编译不报错,

但是却存在隐患。

1、无符号扩展直接高位补0

例如,无符号扩展

     unsigned short e = 100;
     int f = e;
     printf("e= %.2xH\n", e);
     show_bytes((byte_pointer)&e, sizeof(e));

     printf("f= %.2xH\n", f);
     show_bytes((byte_pointer)&f, sizeof(f));

输出

e= 64H
6400

其中 e = 64 是 整数 100 对应的十六进制,其后的6400 的机器里面的存储的字节顺序,我的机器是 centos 64位,是大端机,
也就是低位在高位,高位在低位存储。

比较容易理解的顺序是

0064

short 类型是16位,2个字节

f= 64H
64000000

其中 f = 64 是 整数 100 对应的十六进制,其后的64000000的机器里面的存储的字节顺序

int类型是32位,4个字节,所以是

00000064

2、有符号正数扩展

高位也是补0

     short g = 32767;
     int h = g;
     printf("g= %.2x\n", g);
     show_bytes((byte_pointer)&g, sizeof(g));

     printf("h= %.2x\n", h);
     show_bytes((byte_pointer)&h, sizeof(h));

输出结果

g= 7fff
        ff7f
        h= 7fff
        ff7f0000

short g = 32767 的二进制表示是 0111 1111 1111 1111

十六进制是7ffff

in h=g 的话

二进制表示是

0000 0000 0000 0000 0111 1111 1111 1111

十六进制是 0000f7ff

高位补了0了

3、有符号负数扩展

高位补1

    short j = -32768;
     int k = j;
     printf("j= %.2x\n", j);
     show_bytes((byte_pointer)&j, sizeof(j));

     printf("k= %.2x\n", k);
     show_bytes((byte_pointer)&k, sizeof(k));

输出结果

j= ffff8000
0080
k= ffff8000
0080ffff

short j = -32768 的二进制表示是  1000 0000 0000 0000 j的printf("j= %.2x\n", j) 为 ffff 8000, 预想是8000,多输出了ff ff ,这个可能是printf 的机制,有时间研究一下。接着字节顺序,因为是大端机所以输出了0080

int k = j;  把两个字节扩展为4个字节,二进制表示是 1111 1111 1111 1111 1000 0000 0000 0000字节输出是 0080ffff
				
时间: 2024-09-28 23:20:26

深入理解计算机系统学习(位扩展)的相关文章

深入理解计算机系统学习笔记(一)

程序的编译过程 为了说明程序的编译过程,我们用经典的hello world程序作为例子 #include <stdio.h> int main(int argc, char const *argv[]) { printf("hello world!!!\n"); return 0; } 在linux系统中,我们用GCC编译器将源程序文件helloworld.c编译成可执行目标文件helloworld. zengwh@zengwh:~/test_code$ gcc hello

深入理解计算机系统学习(1)

源文件:0, 1 组成每行以一个看不见的'\n'结尾, 执行一个源文件分四个阶段:预处理, 编译,汇编,连接 .i 文件:.c文件预处理后生成 .ii文件: .cpp文件预处理后生成 预处理阶段:预处理器(cpp)根据以#开头的命令修改源程序,(如把一些头文件的内容,直接插入到程序文本中) 编译阶段.编译器(ccl)将.i 文本翻译成 .s 文本,他包含了一个汇编程序,汇编语言程序中没仪表语句都以一种标准的额问题本格式确切的描述了一条低级机器语言指令 汇编阶段.汇编器(as) 将.s 文件翻译成

深入理解计算机系统学习( 栈的压入和弹出)

栈的初始 压入栈 pushq  s R[%rsp]=   R[%rsp] -8 M[R[%rsp] ] = s 弹出栈 popq  d d = M[R[%rsp] ] R[%rsp]=   R[%rsp] +8

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

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

深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字

上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言中的有符号数和无符号数 上一篇博客我们给出了C语言中在32位机器和64位机器中支持的整型类型数据,我们这里只给出32位机器上的: 尽管 C 语言标准没有指定有符号数要采用某种编码表示,但是几乎所有的机器都使用补码.通常大多数数字是默认有符号的,比如当声明一个像12345或者0xABC这样的常量的时候

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

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

深入理解计算机系统(1.1)------Hello World 是如何运行的

上一篇序章我谈了谈 程序员为啥要懂底层计算机结构 ,有人赞同也有人反对,但是这并不影响 LZ 对深入理解计算机系统研究的热情.这篇博客以案例驱动的模式,通过跟踪一个简单 Hello World 程序的生命周期开始系统的学习,包括它被程序员创建,到在系统上运行,输出简单的消息,然后终止.LZ 将沿着这个程序的声明周期,先简要的介绍一些逐步出现的关键概念.专业术语以及组成部分.后面将会详细展开. 1.计算机系统 我们知道计算机系统是由硬件和软件组成的.它们共同工作来运行应用程序.虽然系统的实现方式随

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

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

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

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