《深入理解计算机系统》书籍学习笔记 - 第二课 - 位,字节和整型

Lecture 02 Bits,Bytes, and Integer 位,字节和整型

文章目录

  • Lecture 02 Bits,Bytes, and Integer 位,字节和整型
    • Byte 字节
    • 位操作
      • 布尔代数
      • 集合的表现形式和操作
      • C语言的逻辑操作
    • 位移操作
    • 整型
      • 数值范围
      • 无符号与有符号数值
        • 无符号与有符号在C中
    • 拓展和截断
      • 拓展
      • 截取

只有宾夕法尼亚大学建立的第一台电子计算机 ENIAC 使用十进制进行了算数运算,它们使用十个电子管来表示每个数字。

Byte 字节

Byte = 8 bits

  • 二进制:00000000 - 11111111
  • 十进制:0 - 255 = 2^8 - 1
  • 十六进制:00 - FF (1111=2^4 - 1 = 15 = F)

C 数据类型占用的字节:
在这里插入图片描述

位操作

布尔代数

  • & and 且

  • | or 或

  • ~ not 非

  • ^ xor(Exclusive-or) 异或
    A^B = 1, 当 A=1或者B=1时,但不是全部都为1

^ | 0  1
---------
0 | 0  1
1 | 1  0

集合的表现形式和操作

  • 表现形式
    宽度为w (width)位的向量表示的子集: {0, …, w–1}
    如果j ∈ A (j 属于 A) ,则 第j位数 a = 1

操作示例:
01101001 { 0, 3, 5, 6 }
76543210
01010101 { 0, 2, 4, 6 }
76543210

操作:

  • & Intersection (交集) 01000001 { 0, 6 }
  • | Union (并) 01111101 { 0, 2, 3, 4, 5, 6 }
  • ^ Symmetric difference(对称差) 00111100 { 2, 3, 4, 5 }
  • ~ Complement(补集) 10101010 { 1, 3, 5, 7 }

C语言的逻辑操作

与位操作有些相似,不要搞混淆。

操作符:&&, ||, !
特性:

  • 0 视为 “False”
  • 所有非0的都视为 “True”
  • 返回值都是 0 或 1
  • 提前终止特性

位移操作

  • 左移 x << y
    将位向量x左移y个位置。
    扔掉左边多余的部分。
    右边空位填0

  • 右移 x >> y
    将位向量x右移y个位置。
    扔掉右边多余的部分。

逻辑右移:
左边空位填0

算术右移:
左边空位填充符号位

示例:

Argument x    : 10100010
x << 3        : 00010000
Log. x >> 2   : 00101000
Arith. x >> 2 : 11101000

整型

在这里插入图片描述

  • 无符号类型 Unsigned
  • 二进制补码 Two’s Complement
    符号位:0 表示正数, 1 表示负数。

补码:表示有符号数的最常用的方式,有符号数还有其他表示方式,但是补码是最常用的方式。

数值范围

  • 无符号值
    UMin = 0 (000…0)
    Umax = 2^w -1 (111…1)

  • 二进制补码
    TMin = -2^(w-1) (100…0)
    TMax = 2^(w-1) -1 (011…1)

-1 : 111…1

如下:
在这里插入图片描述

  • 规律
    |TMin| = TMax + 1
    UMax = 2 * TMax + 1

  • c程序
    limits.h 定义了一些边界值。

#include <limits.h>
ULONG_MAX
LONG_MAX
LONG_MIN

无符号与有符号数值

B: Binary 二进制,U: Unsigned 无符号, T: Two’s Complement 二进制补码

在这里插入图片描述

无符号与有符号的转换映射:

在这里插入图片描述

映射值示例:
在这里插入图片描述

4位为例,符号位为1时:符号位的值 + 其他位的值
二进制补码:-2^3 + 其他位的值 = -8 + 其他位的值
无符号:2^3 + 其他位的值 = 8 + 其他位的值
无符号 - 二进制补码 = 8 + 其他位的值 - (-8 + 其他位的值) = 16 = 2^4

  • 二进制补码转换为无符号
    Umax = 2^w -1 (111…1)
    TMin = -2^(w-1) (100…0)
    TMax = 2^(w-1) -1 (011…1)
    在这里插入图片描述
无符号与有符号在C中
  • 默认整型为有符号
  • 无符号用后缀U表示:0U, 123123U

转换:

  • 显示转换
int tx, ty;
unsigned ux, uy;
tx = (int)ux;
uy = (unsigned) ty;
  • 隐士转换
    在参数赋值和过程调用时可能发生。
ty = ux;  // 无符号赋值给有符号
uy = ty;
  • 有符号无符号比较运算
    W = 32, TMIN = -2,147,483,648, TMAX = 2,147,483,647
常量1               常量2               比较结果    结果类型    
0                   0U                  ==          unsigned
-1                  0                   <           signed
-1                  0U                  >           unsigned
2147483647          -2147483647-1       >           signed	
2147483647U         -2147483647-1       <           unsigned
-1                  -2                  >           signed
(unsigned)-1        -2                  >           unsigned
2147483647          2147483648U         >           unsigned
2147483647         (int)2147483648U     >           signed

结论:无符号和有符号的运算,有符号转化为无符号进行运算和比较,结果为无符号。

代码验证结论:

#include <stdio.h>

void main() {
    int x = -7;
    unsigned int ux = 3;
    if (x > ux) {
        printf("signed -7 > unsigned 3");
    }
}

// output:
// signed -7 > unsigned 3

拓展和截断

拓展

前面填充数字。
结果不会改变。

  • 无符号
    拓展字段用0填充。

  • 有符号
    拓展字段用符号位填充。

    short int x = 15213;
    int ix = (int)x;
    short int y = -15213;
    int iy = (int)y;

x: 15213, 00111011 01101101
ix: 15213, 00000000 00000000 00111011 01101101
y: -15213 11000100 10010011
iy: -15213, 11111111 11111111 11000100 10010011

截取

截取前面的数字。
对于小数值结果不会改变,对于大数值结果可能会改变。

  • 无符号
    直接截取,相当于进行模运算:x mod 2^k

  • 有符号
    前面的符号位被截取。
    类似于模运算。

#include <stdio.h>

void main() {
    int x = 53191;
    short int ix = (int)x;
    int y = -53191;
    short iy = (int)y;
    printf("x: decimal=%d,Hex=%x, ",x,x);
    printfBinary(x);
    printf("ix: decimal=%d,Hex=%x, ",ix,ix);
    printfBinary(ix);
    printf("y: decimal=%d,Hex=%x, ",y,y);
    printfBinary(y);
    printf("iy: decimal=%d,Hex=%x, ",iy,iy);
    printfBinary(iy);
}

//输出一个数的二进制
printfBinary(int num,int w){
    unsigned mask;
    sscanf_s("%d", &num);
    mask = 1u << 31;
    for(;mask;mask>>=1){
        printf("%d", num&mask?1:0);
    }
    printf("\n");
}

// output
// x:  decimal=53191 ,Hex=cfc7    , 0000000000000000 1100111111000111
// ix: decimal=-12345,Hex=ffffcfc7, 1111111111111111 1100111111000111
// y:  decimal=-53191,Hex=ffff3039, 1111111111111111 0011000000111001
// iy: decimal=12345 ,Hex=3039    , 0000000000000000 0011000000111001

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/136973.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年【电工(初级)】考试内容及电工(初级)复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;考试内容是安全生产模拟考试一点通总题库中生成的一套电工&#xff08;初级&#xff09;复审模拟考试&#xff0c;安全生产模拟考试一点通上电工&#xff08;初级&#xff09;作业手…

C++语言的广泛应用领域

目录 1. 系统级编程 2. 游戏开发 3. 嵌入式系统 4. 大数据处理 5. 金融和量化分析 6. 人工智能和机器学习 7. 网络和通信 结语 C是一种多范式编程语言&#xff0c;具有高性能、中级抽象能力和面向对象的特性。由Bjarne Stroustrup于1979年首次设计并实现&#xff0c;C在…

电路综合-基于简化实频的SRFT集总参数切比雪夫低通滤波器设计

电路综合-基于简化实频的SRFT集总参数切比雪夫低通滤波器设计 6、电路综合-基于简化实频的SRFT微带线切比雪夫低通滤波器设计中介绍了使用微带线进行切比雪夫滤波器的设计方法&#xff0c;在此对集总参数的切比雪夫响应进行分析。 SRFT集总参数切比雪夫低通滤波器综合不再需要…

SpringBootWeb案例——Tlias智能学习辅助系统(3)——登录校验

前一节已经实现了部门管理、员工管理的基本功能。但并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台&#xff0c;这节来实现登录认证。 目录 登录功能登录校验(重点)会话技术会话跟踪方案一 Cookie&#xff08;客户端会话跟踪技术&#xff09;会话跟踪方案二…

Django(三、数据的增删改查、Django生命周期流程图)

文章目录 一、 基于ORM进行的CURDuser_list&#xff1a;作为主页使用路由文件urls.py配置如下&#xff1a;add.html&#xff1a;用于新增用户的数据页add页面视图函数如下:edit.html&#xff1a;修改数据的页面那么来总结一下上序所操作所用到的内容。 导入已存在的表其方式有两…

某手游完整性校验分析

前言 只是普通的单机手游&#xff0c;广告比较多&#xff0c;所以分析处理了下&#xff0c;校验流程蛮有意思的&#xff0c;所以就分享出来了 1.重打包崩溃处理 样本进行了加固&#xff0c;对其dump出dex后重打包出现崩溃 ida分析地址发现为jni函数引起 利用Xposed直接替换…

Java学习

Java的三大版本 Write Once、Run Anywhere JavaSE:标准版&#xff08;桌面程序,控制台开发…) JavaME:嵌入式开发(手机,小家电…) JavaEE: E企业级开发(web端&#xff0c;服务器开发…) JDK : Java Development Kit&#xff0c;Java开发者工具&#xff0c;在JRE之上扩充了一些…

算法进阶指南图论 通信线路

通信线路 思路&#xff1a;我们考虑需要升级的那条电缆的花费&#xff0c;若其花费为 w &#xff0c;那么从 1 到 n 的路径上&#xff0c;至多存在 k 条路径的价值大于 w &#xff0c;这具有一定的单调性&#xff0c;当花费 w 越大&#xff0c;我们路径上价值大于 w 的花费会越…

Unity 使用INI文件存储数据或配置参数预设

法1&#xff1a;调用外部Capi库 具体使用&#xff1a; public class Ini{//读取INI文件需要调用C的APP[System.Runtime.InteropServices.DllImport("kernel32")]private static extern long WritePrivateProfileString(string section, string key, string val, st…

STM32--系统滴答SysTick

一、SysTick是什么&#xff1f; Systick定时器是一个24bit的倒计时&#xff08;向下计数&#xff09;定时器&#xff0c;功能就是实现简单的延时。 SysTick 是一种系统定时器&#xff0c;通常在嵌入式系统中使用。它是 ARM Cortex-M 处理器的一个特殊定时器&#xff0c;用于提…

7.运算符

目录 一.算数运算符 1、算术运算符 2、比较运算符 1、等号()用来判断数字、字符串和表达式是否相等。 2、安全等于运算符(<>) 3、不等于运算符(<>或者!) 4、小于或等于运算符(<) 5、小于运算符(<) 6、IS NULL(IS NULL)&#xff0c;IS NOT NULL 运算…

[MySQL] MySQL表的基础操作

文章目录 一、创建表 1、1 SQL语法 1、2 实例演示 二、查询表 三、修改表 3、1 修改表名字 3、2 新增列&#xff08;字段&#xff09; 3、3 修改列类型 3、4 修改列名 3、5 删除表 四、总结 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍♂️ &#x1f440; 专…

【MySQL日志与备份篇】数据库备份与恢复

数据库备份与恢复 文章目录 数据库备份与恢复1. 物理备份与逻辑备份2. mysqldump实现逻辑备份2.1 备份一个数据库2.2 备份全部数据库2.3 备份部分数据库2.4 备份部分表2.5 备份单表的部分数据2.6 排除某些表的备份2.7 只备份结构或只备份数据2.8 备份中包含存储过程、函数、事件…

微信聊天,收到二维码图片就自动帮你提取出来的方法

10-3 如果你是二维码收集的重度用户&#xff0c;那我非常推荐你好好阅读本文&#xff0c;也许可以帮你解决你的问题&#xff0c;比如做网推的人&#xff0c;需要常年混迹在各种微信群&#xff0c;那如何在各个微信群中收集到群友分享出来的二维码&#xff0c;并且要立即保存出…

吃透 Spring 系列—MVC部分

目录 ◆ SpringMVC简介 - SpringMVC概述 - SpringMVC快速入门 - Controller中访问容器中的Bean - SpringMVC关键组件浅析 ◆ SpringMVC的请求处理 - 请求映射路径的配置 - 请求数据的接收 - Javaweb常用对象获取 - 请求静态资源 - 注解驱动 标签 ◆ SpringMV…

推荐系统笔记--Swing模型的原理

1--Swing模型的引入 在 Item CF 召回中&#xff0c;物品的相似度是基于其受众的交集来衡量的&#xff0c;但当受众的交集局限在一个小圈子时&#xff0c;就会误将两个不相似的物品定义为相似&#xff1b; Swing 模型引入用户的重合度来判断两个用户是否属于一个小圈子&#xff…

C++基础(2)——类和对象

目录 1. 类的引入&#xff1a; 2. 类的定义&#xff1a; 2.1类的定义以及基本结构&#xff1a; 2.2 类的访问限定符&#xff1a; 3. 类的声明与定义的分离&#xff1a; 4. 类的实例化&#xff1a; 5. 类的大小计算&#xff1a; 1. 类的引入&#xff1a; 在数据结构系列的…

使用openvc进行人脸检测:Haar级联分类器

1 人脸检测介绍 1.1 什么是人脸检测 人脸检测的目标是确定图像或视频中是否存在人脸。如果存在多个面&#xff0c;则每个面都被一个边界框包围&#xff0c;因此我们知道这些面的位置 人脸检测算法的主要目标是准确有效地确定图像或视频中人脸的存在和位置。这些算法分析数据…

[Android]修改应用包名、名称、版本号、Icon以及环境判断和打包

1.修改包名 在Android Studio中更改项目的包名涉及几个步骤&#xff1a; 打开项目结构: 在Android Studio中&#xff0c;确保您处于Android视图模式&#xff08;在左侧面板顶部有一个下拉菜单可以选择&#xff09;。 重命名包名: 在项目视图中&#xff0c;找到您的包名&…

结构型设计模式07-享元模式

结构型设计模式07-享元模式 1、享元模式介绍 享元模式是一种结构型设计模式&#xff0c;旨在通过共享对象来减少内存使用和提高性能。它主要用于处理大量细粒度对象的情况&#xff0c;其中许多对象具有相似的属性和行为。 在享元模式中&#xff0c;对象分为两种类型&#xf…