IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 计算机底层-关于隐式转换和补码(困扰了我好几个月的问题) -> 正文阅读

[C++知识库]计算机底层-关于隐式转换和补码(困扰了我好几个月的问题)

问题:
C语言程序在32位机器上运行。程序中定义了三个变量X、Y、Z,其中X和Z是int型,Y为short型。当X=127,Y=-9时,执行赋值语句Z=X+Y后,X、Y、Z的值分别是多少?(十六进制数表示)

首先,计算机采用补码计算。
按照正常的思路是这样的:
在这里插入图片描述
很遗憾,这样是错误的!
下面解释原因(困惑了我好几个月)
先说答案:Z = 00000076H

为什么会是这样?我的第一反应是答案错了。事实真是如此吗?
我试着输出一下127的二进制:

int x = 127;
for(int i=31;i>=0;i--)	cout << ((x>>i)&1);
cout << endl;

结果是这样:
在这里插入图片描述

再输出一下-9的补码的二进制:

short y = -9;
for(int i=15;i>=0;i--)	cout << ((y>>i)&1);
cout << endl;

结果是这样:
在这里插入图片描述

也没毛病。


当我将-9当作int类型输出32位二进制位的时候,我发现了问题。

short y = -9;
for(int i=31;i>=0;i--)	cout << ((y>>i)&1);
cout << endl;

结果是这样:
在这里插入图片描述

似乎高位多了很多1。
我恍然大悟:原来发生了隐式转换。(int)+ (short) = (int) + (short)
这种隐式转换小范围转换为大范围后,不会发生数值错误。
即相加的过程应该将Y也当作int类型参与计算。

计算过程应该是这样的:
在这里插入图片描述


(***,谁会想到这种东西做这个的时候会发生隐式转换啊)
自此,问题得到了很好的解决。(要想弄懂底层不是一件容易的事情啊,要会融会贯通)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:00:54  更:2022-05-07 11:01:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 4:22:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码