mooc上说这里(char)-c是在取补码,为什么是在取补码呢?
c在整过程中的类型和低八位是如何变化的?
为什么这里(char)-c是在取补码
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
15条回答 默认 最新
- 专家-皆知 2024-03-16 22:45关注
引自免费微信小程序:皆我百晓生
在C语言中,
unsigned char
类型的变量c
被赋值为十六进制数0xAA
。由于%hhx
是以十六进制形式输出无符号字符型数据的格式符,因此我们看到输出的c=aa
实际上表示的是c
的原始二进制值(即1010 1010
)。接下来讨论
(char)-c
:- 当对一个无符号类型进行负号操作时,C语言会根据整数提升规则将其转换为有符号类型(在这种情况下是
int
类型),然后再执行负数运算。 - 对于有符号类型的整数
-c
,编译器首先找到c
在其对应有符号类型中的补码形式(对于0xAA
对应的有符号int
补码表示是一个负数,因为最高位是1)。 - 然后对该补码取反加一,得到
-c
的值。 - 最后,将
-c
强制转换回char
类型,并用%hhx
输出。
由于
char
可能是有符号或无符号的(具体取决于实现),这里强制转换为(char)
后可能会导致截断高字节信息,只保留低八位。不过在本例中,由于原数值已经通过计算变成了一个正数(实际上是对0xAA
取补码后加1的结果),所以最终输出的-c
值是基于转换前计算出的有符号int
类型的-c
的低位部分。因此,
(char)-c
输出56
的原因是它显示了经过上述处理后-c
的最低八位的十六进制表示。虽然这里的表述方式可能不是直观上的“取补码”,但实质上确实是通过取补码运算过程得到了这个结果。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 - 当对一个无符号类型进行负号操作时,C语言会根据整数提升规则将其转换为有符号类型(在这种情况下是
悬赏问题
- ¥15 phython路径名过长报错 不知道什么问题
- ¥15 深度学习中模型转换该怎么实现
- ¥15 HLs设计手写数字识别程序编译通不过
- ¥15 Stata外部命令安装问题求帮助!
- ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
- ¥15 TYPCE母转母,插入认方向
- ¥15 如何用python向钉钉机器人发送可以放大的图片?
- ¥15 matlab(相关搜索:紧聚焦)
- ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
- ¥15 Arduino无法同时连接多个hx711模块,如何解决?