【深入理解计算机系统第3版】有符号数和无符号数转换以及移位运算练习题2.23

题目

考虑下面的C函数:

int fun1(unsigned word)
{return (int) ((word << 24) >> 24);
}int fun2(unsigned word)
{return ((int) word << 24) >> 24;
}

假设一个采用补码运算的机器上以32位程序来执行这些函数。还假设有符号数值的右移是算术右移,而无符号数值的右移是逻辑右移。填写以下表格。

wfun1(w)fun2(w)
0x00000076
0x87654321
0x000000c9
0xedcba987

 代码

#include <stdio.h>
#include <string.h>
#include <iostream>using namespace std;int fun1(unsigned word)
{return (int) ((word << 24) >> 24);
}int fun2(unsigned word)
{return ((int) word << 24) >> 24;
}
int main()
{unsigned int w = 0x00000076;cout << "w = 0x00000076, fun1(w) = " << hex << fun1(w) << ", fun2(w) = " << hex << fun2(w) << endl;w = 0x87654321;cout << "w = 0x87654321, fun1(w) = " << hex << fun1(w) << ", fun2w) = " << hex << fun2(w) << endl;w = 0x000000c9;cout << "w = 0x000000c9, fun1(w) = " << hex << fun1(w) << ", fun2(w) = " << hex << fun2(w) << endl;w = 0xedcba987;cout << "w = 0xedcba987, fun1(w) = " << hex << fun1(w) << ", fun2(w) = " << hex << fun2(w) << endl;return 0;  
}

结果 

分析

对于fun1函数来说,(int)((word << 24) >> 24)的执行顺序是

  1. word << 24 word左移24位
  2. (word << 24) >> 24 然后右移24位
  3. (int)((word << 24) >> 24) 最后从无符号数转换成有符号数

对于fun2函数来说,((int) word << 24) >> 24的执行顺序是

  1. (int) word  word 被转换成有符号数
  2. (int) word << 24 然后左移24位
  3. ((int) word << 24) >> 24 最后右移24位

相同位模式的有符号数和无符号数,由于编码定义的不同,表示的整数会有所不同。

fun1: 对于无符号数w来说,经过左移24位和右移24位后,所有的数值都会变成0x000000XX(XX=76,21,c9,87)。由于最左边16进制数为0,二进制表示为0000。这样的位模式表示为有符号数值为正,即和无符号数的位模式一样。

fun2: w转换为有符号数后左移操作和无符号数的左移操作是一样的,即都在位最右端填充24个0。

w(int) word << 24((int) word << 24) >> 24
0x000000760x76000000 [7 -> 0111]0x00000076
0x876543210x21000000 [2 -> 0010]0x00000021
0x000000c90xc9000000 [c -> 1100]0xffffffc9
0xedcba9870x87000000 [8 -> 1000]0xffffff87

由于最左端的位产生了变换, 0xc9000000和0x87000000是负数,所以接下来的右移会是算术右移。而正数的右移依旧是逻辑右移。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git操作码云(gitee)创建仓库到上传到远程仓库

想必有的小伙伴在为上传到码云远程仓库而感到烦恼吧&#xff01;本篇为大家详细讲解实现过程&#xff0c;跟着我的步伐一步一步来。 我就当大家已经注册好了码云 一、在码云上需要的操作 接下来我们需要使用到 git 了 二、git 上的操作 到了咋们的git了&#xff0c;开整 首…

基于PyAutoGUI图片定位的自动化截图工具--jmeter部分

1、计划 压测完成后需要编写性能测试报告&#xff0c;报告中所需数据截图较多&#xff0c;使用自动化操作方便快捷&#xff0c;就编写一个界面工具以便后续复用。之前编写过loadrunner报告的自动化截图脚本&#xff0c;现在用jmeter也比较多&#xff0c;就编写jmeter部分&#…

树形查找试题(二叉树、红黑树)

一、单项选择题 01.对于二叉排序树&#xff0c;下面的说法中&#xff0c;()是正确的。 A.二叉排序树是动态树表&#xff0c;查找失败时插入新结点&#xff0c;会引起树的重新分裂和组合 B.对二叉排序树进行层序遍历可得到有序序列 C.用逐点插入法构造二叉排序树&#xff0c;若先…

上海人工智能实验室的书生·浦语大模型学习笔记(第二期第三课——上篇)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型&#xff0c;这次有机会参与试用&#xff0c;特记录每次学习情况。 一、课程笔记 本次学习的是RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;它是通过检索与用户输入相关的信息片段…

【简单讲解下WebView的使用与后退键处理】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

MySQL操作DML

目录 1.概述 2.插入 3.更新 4.删除 5.查询 6.小结 1.概述 数据库DML是数据库操作语言&#xff08;Data Manipulation Language&#xff09;的简称&#xff0c;主要用于对数据库中的数据进行增加、修改、删除等操作。它是SQL语言的一部分&#xff0c;用于实现对数据库中数…

力扣--图论/Prim1584.连接所有点的最小费用

思路分析&#xff1a; 初始化&#xff1a;获取点的数量&#xff0c;并创建两个辅助数组 adjvex 和 lowcost&#xff0c;分别用于记录最小生成树的边信息和每个顶点到最小生成树的距离。Prim算法循环&#xff1a;在每一次循环中&#xff0c;选择一个未加入最小生成树的顶点 k&a…

软考122-上午题-【软件工程】-需求分析

一、软件需求 在进行需求获取之前&#xff0c;首先要明确需要获取什么&#xff0c;也就是需求包含哪些内容。 软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。通常&#xff0c;这些需求包括功能需求、性能需求、用户或人的因素、环境需求、界面需…

科研学习|可视化——相关性结果的可视化

一、相关性分析介绍 相关性分析是指研究两种或者两种以上的变量之间相关关系的统计分析方法&#xff0c;一般分析步骤为&#xff1a; 1&#xff09;判断变量间是否存在关联&#xff1b;2&#xff09;分析关联关系&#xff08;线性/非线性&#xff09;、关联方向&#xff08;正相…

Qt中的网络通信

C没有封装专门的网络套接字的类&#xff0c;因此C只能调用C对应的API&#xff0c;而在Linux和Windows环境下的API都是不一样的 Qt作为一个C框架提供了相关封装好的套接字通信类 在Qt中需要用到两个类&#xff0c;两个类都属于network且都是属于IO操作&#xff0c;只不过这两个类…

混合云构建-如何通过Site to Site VPN 连接 AWS 和GCP云并建立一个高可用的VPN通信

如果我们的业务环境既有AWS云又有GCP云,那么就需要将他们打通,最经济便捷的方式就是通过Site-to-Site VPN连接AWS和GCP云,你需要在两个云平台上分别配置VPN网关,并建立一个VPN隧道来安全地连接这两个环境,我们下面演示一个高可用场景下的S2S VPN线路构建,采用动态BGP协议…

Innodb架构解析

整体架构 通过《面试官&#xff1a;一条SQL是如何执行的&#xff1f;》我们了解了MySQL架构&#xff0c;下面我们看下Innodb架构。 innodb最早由Innobase Oy公司开发&#xff0c;5.5版本开始是MySQL默认存储引擎&#xff0c;该存储引擎是第一个完整支持ACID事务的MySQL存储引…

git修改本地提交历史邮箱地址

1、Git&#xff08;Git&#xff09; 2、修改Git本地提交历史中的邮箱地址 使用 git rebase 命令进行交互式重置。 具体步骤如下&#xff1a;&#xff08;https://git-scm.com/docs/git-rebase&#xff09; 1、查看提交历史&#xff1a; 使用 git log 命令列出提交历史&#x…

弹簧、质量的bode、nyquist与根轨迹图

在控制系统分析中&#xff0c;Bode图、Nyquist图和根轨迹图都是重要的工具&#xff0c;用于评估和分析系统的性能。这些系统的Nyquist图提供了最大的旋转&#xff0c;即它们在频率变化时表现出最大的相位变化。当Nyquist图完全位于虚轴上时&#xff0c;意味着系统的增益&#x…

【学习】移动端兼容性测试有什么方法及重要性

随着移动互联网的快速发展&#xff0c;移动应用程序已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;由于各种移动设备的硬件和软件差异&#xff0c;移动应用程序的兼容性问题也越来越突出。因此&#xff0c;移动端兼容性测试成为了一个重要的环节&#xff0c;它可以…

猝不及防 CCF-B ICPP 2024投稿延期至4月22日提交摘要 机会来了别错过

会议之眼 快讯 第53届ICPP&#xff08;International Conference on Parallel Processing&#xff09;即国际并行处理会议将于 2024年 8月12日-15日在瑞典哥特兰岛举行&#xff01;ICPP是世界上最古老的连续举办的并行计算计算机科学会议之一。它是学术界、工业界和政府的研究…

1572. 【基础赛】涂色(paint)

1572. 【基础赛】涂色&#xff08;paint&#xff09; (Input: paint.in, Output: paint.out) 时间限制: 2 s 空间限制: 256 MB 具体限制 题目描述 Introl获得了一个N行的杨辉三角&#xff0c;他将每行中值为奇数的位置涂为了黑色。 Chihiro将提出M次询问&#xff0c;在第L…

C语言强制类型转换

目录 王道ppt总结&#xff1a; ​编辑相关博主文章&#xff1a; 王道ppt总结&#xff1a; 相关博主文章&#xff1a;char范围详解&#xff0c;为什么是-128~127,以及int类型范围详解&#xff08;整型数据在内存中的存储&#xff09;_char型和int型数据范围-CSDN博客https://b…

数据分析——数据规范化

数据规范化是数据分析中的一个重要步骤&#xff0c;其目的在于确保数据的一致性和可比性&#xff0c;提高数据质量和分析结果的准确性。以下是一些数据规范化的常见方法和技术&#xff1a; 数据清洗&#xff1a;此步骤主要清除数据中的重复项、空格、格式错误等&#xff0c;确…

微信小程序uniapp+vue电力巡线任务故障报修管理系统2q91t

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 前端开发:vue 语言&#xff1a;javapythonnodejsphp均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 框架支持:Ssm/django/flask/t…