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

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/120143.html

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

相关文章

安防监控EasyCVR视频汇聚平台使用海康SDK播放时,画面播放缓慢该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、…

物业报修管理软件哪个好?如何提升物业管理和维修服务质量?

在当前的数字化时代&#xff0c;物业管理软件在物业行业中的作用日益凸显。它不仅能够有效提升管理效率&#xff0c;还能够优化服务质量&#xff0c;拓展收入来源&#xff0c;推动智慧物业的全面实现。本文将深入探讨“的修”报修管理软件如何通过其独特的功能和优势&#xff0…

【机器学习】Kmeans聚类算法

一、聚类简介 Clustering (聚类)是常见的unsupervised learning (无监督学习)方法&#xff0c;简单地说就是把相似的数据样本分到一组&#xff08;簇&#xff09;&#xff0c;聚类的过程&#xff0c;我们并不清楚某一类是什么&#xff08;通常无标签信息&#xff09;&#xff0…

《009.Springboot+vue之进销存管理系统》

《009.Springbootvue之进销存管理系统》 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatisredis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; 1.用户管…

AC修炼计划(AtCoder Regular Contest 163)

传送门&#xff1a;AtCoder Regular Contest 163 - AtCoder 第一题我们只需要将字符串分成两段&#xff0c;如果存在前面一段比后面一段大就成立。 #include<bits/stdc.h> #define int long long using namespace std; typedef long long ll; typedef pair<int,int&g…

程序设计:控制台输出二叉树 二叉树的形象显示

本文指导你编写一个输出到字符控制台的形象的二叉树展示。 目录 一般的Tree显示方式 理想的显示方式 实现方法 计算显示位置 输出数据 计算显示位置的代码 输出数据的代码 一般的Tree显示方式 编写二叉树算法时调试是很头疼的&#xff0c;如何显示成一目了然的树结构呢…

Flink SQL DataGen Connector 示例

Flink SQL DataGen Connector 示例 1、概述 使用 Flink SQL DataGen Connector&#xff0c;可以快速地生成符合规则的测试数据&#xff0c;可以在不依赖真实数据的情况下进行开发和测试。 2、使用示例 创建一个名为 “users” 的表&#xff0c;包含 6 个字段&#xff1a;id…

PHP分类信息网站源码系统 电脑+手机+微信端三合一 带完整前后端部署教程

大家好啊&#xff01;今天源码小编来给大家分享一款PHP分类信息网站类源码系统。这款源码系统是一套专业的信息发布类网站综合管理系统&#xff0c;适合各类地方信息和行业分类站点建站。随着这几年我们国家网民爆炸式的增 长&#xff0c;网络信息也随之越来越庞大&#xff0c;…

为什么亚马逊的轻量应用服务器这么受欢迎 | 个人体验 | 优势所在

文章目录 &#x1f33a;前言⭐什么是轻量应用服务器&#x1f6f8;特点 &#x1f384;亚马逊轻量应用服务器体验如何&#x1f339;亚马逊轻量应用服务器的优势 &#x1f33a;前言 作为一为开发者&#xff0c;我们要开发部署一个自己的网站&#xff0c;要选择一个性能好的服务器…

算法训练 第六周

一、用栈实现队列 本题要求我们使用栈这个数据结构来模拟实现队列的各种操作&#xff0c;我们的具体思路是使用两个栈&#xff0c;将一个栈当作输入栈&#xff0c;用于压入 push传入的数据&#xff1b;另一个栈当作输出栈&#xff0c;用于 pop和 peek 操作。每次 pop 或 peek 时…

大数据学习之Spark性能优化

文章目录 Spark三种任务提交模式宽依赖和窄依赖StageSpark Job的三种提交模式 Shuffle机制分析未优化的Hash Based Shuffle优化后的Hash Based ShuffleSort-Based Shuffle Spark之checkpointcheckpoint概述checkpoint与持久化的区别checkPoint的使用checkpoint源码分析 Spark程…

实现前后端分离开发:构建现代化Web应用

文章目录 什么是前后端分离开发&#xff1f;为什么要采用前后端分离开发&#xff1f;前后端分离的最佳实践1. 定义API2. 使用RESTful风格3. 选择适当的前端框架4. 选择合适的后端技术5. 数据交互格式6. 前端路由7. 自动化构建和部署8. 跨域问题 示例&#xff1a;前后端分离开发…

代码随想录算法训练营第四十七天 | LeetCode 198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III

代码随想录算法训练营第四十七天 | LeetCode 198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III 文章链接&#xff1a;打家劫舍 打家劫舍 II 打家劫舍 III 视频链接&#xff1a;打家劫舍 打家劫舍 II 打家劫舍 III 1. LeetCode 198. 打家劫舍 1.1 思路 我们要去偷钱&#…

【论文阅读】Generating Radiology Reports via Memory-driven Transformer (EMNLP 2020)

资料链接 论文原文&#xff1a;https://arxiv.org/pdf/2010.16056v2.pdf 代码链接&#xff08;含数据集&#xff09;&#xff1a;https://github.com/cuhksz-nlp/R2Gen/ 背景与动机 这篇文章的标题是“Generating Radiology Reports via Memory-driven Transformer”&#xf…

Leetcode—2586.统计范围内的元音字符串数【简单】

2023每日刷题&#xff08;二十二&#xff09; Leetcode—2586.统计范围内的元音字符串数 实现代码 class Solution { public:int vowelStrings(vector<string>& words, int left, int right) {int ans 0;for(int i left; i < right; i) {string s words[i];i…

解决:ImportError: cannot import name ‘get_config‘

解决&#xff1a;ImportError: cannot import name ‘get_config’ 背景 今天使用Conda构建项目运行环境的时候报错&#xff1a;ImportError: cannot import name ‘get_config’ ##报错问题 from keras.callbacks import LearningRateScheduler, ModelCheckpointFile "D…

GreenPlum简介

简介 Greenplum是一家总部位于**美国加利福尼亚州&#xff0c;为全球大型企业用户提供新型企业级数据仓库(EDW)、企业级数据云(EDC)和商务智能(BI)提供解决方案和咨询服务的公司&#xff0c;在全球已有&#xff1a;纳斯达克&#xff0c;纽约证券交易所&#xff0c;Skype. FOX&…

idea 模板参数注释 {@link}

1. 新增组 2. 设置方法注释及变量 增加模板文本 ** * $param$ * return {link $return$} */3. 设置变量表达式 勾选跳过param 参数表达式 groovyScript("def result ;def params \"${_1}\".replaceAll([\\\\[|\\\\]|\\\\s], ).split(,).toList();def param…

7.spark sql编程

目录 概述RDD ,Datasets,DataFrames 之间的区别Datasets , DataFrames和 RDD 入门people.jsonSparkSession创建 DataFramesDataFrame 操作编程方式运行 sql 查询创建 DatasetsDataFrames 与 RDDs 互相转换使用反射推断模式编码问题 编程指定 Schema官方文档的代码不全问题 结束…

idea使用gradle教程 (idea gradle springboot)2024

这里白眉大叔&#xff0c;写一下我工作时候idea怎么使用gradle的实战步骤吧 ----windows 环境----------- 1-本机安装gradle 环境 &#xff08;1&#xff09;下载gradle Gradle需要JDK的支持&#xff0c;安装Gradle之前需要提前安装JDK8及以上版本 https://downloads.gra…