Y_csgoto 2019-06-06 21:26 采纳率: 66.7%
浏览 1084
已采纳

关于C语言十六进制以及补码原码的疑问

有这样一道题目

int main()

{
char x=0xFFFF;
printf("%d\n",x--);



}


题目最后的答案是输出-1
在网上查了相关资料,说是关于补码与原码转换的
但是看完之后仍然觉得有疑问

疑问1:十六进制在内存中是否是转化为二进制原码之后再以补码储存的?
疑问2:后面那个x--的作用是什么呢?
疑问3:自减符号是不是在二进制运算上相当于原来的补码加了个负一的补码?

求大佬解答

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-06-06 21:59
    关注

    计算机只有二进制没有什么十六进制,也没有什么原码、补码转换。
    计算机内部并不知道一个数字是正还是负数,它只是做简单的加减运算,多了丢掉进位,少了自动借位。
    而一个数字到底是正数还是负数,是printf去解释的。

    char x=0xFFFF;
    因为char是1byte的,所以高位丢掉,变成char x = 0xff
    printf("%d\n",x--);
    对于x--来说,它是先表达式求值,再减去1,所以相当于printf("%d\n",x);x = x-1;
    因为是有符号整数,所以0xff被扩展成0xffffffff,所以输出-1

    一个类比就是时钟,时钟有12个刻度,指针从12 1 2 3 4 ... 11然后指向12
    对于一个时钟来说,它只有一个动作,就是沿着顺时针的方向这么走,很简单,它不需要搞清楚1 = 12 + 1 - 12,也不用搞清楚什么是上午什么是下午。
    首先,它是一个圆环,走完11自动就到了0点。其次,时钟的上午、下午是人为规定的。
    一样的道理,0xff + 1 = 0x(1)00,这个1是假想的进位,其实就是0。反过来说 0x00-1=(0x100-1-0x100)=0xff(-0x100),这里的0x100也是假想的,实际上就是0xff,然后我们就把0xff不当作255,当作了-1

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?