Y_csgoto 2019-06-06 21:26 采纳率: 57.1%
浏览 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

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

报告相同问题?

悬赏问题

  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法