C语言输出负数补码

来源:互联网 发布:淘宝竹鸡打笼 编辑:程序博客网 时间:2024/05/16 12:28

C语言输出负数补码

最近刚好复习到计组的定点数运算,想着以前写快速幂都是打印出正数的补码,从来没有输出过负数的补码,于是写了几行代码,加深对这方面的理解。


要知道的知识

  • 数值在计算机表示为补码表示,所以在C语言里负数也是以补码存储的
  • 了解算术移位和逻辑移位的区别
  • 在第三版的神书CSAPP里面提到

    c语言标准并没有明确定义对于有符号数使用哪种类型的右移。不幸地,这就意味着任何假设一种或者另一种右移形式的代码都可能会遇到可移植性问题。然而,实际上,几乎所有的编译器/机器组合都对有符号数使用算术右移,且许多程序员也都假设机器会使用这种右移。另一方面,对于无符号数,右移必须是逻辑的

  • 任何二进制在机器表示都是一样的,只是c语言的不同类型对其解释不一样。unsigned 类型将最高位解读为数值位,但是像short,int之类的就把最高位解读为符号位。

代码

要想打印出负数的补码,只对负数右移是不行的,因为它进行的是算术右移,这样最终只会无穷无尽地右移为-1,那么我们就可以先把有符号转化为无符号,因为二进制是一样的,只不过无符号和有符号对二进制解读不一样,于是很快写出下面几行小代码

#include <cstdio>int main(){    int num[20], cnt = 0;    short a = -4321;    unsigned short b = a;    printf("%d\n", b);    while(b)    {        num[cnt++] = b & 1;        b >>= 1;    }    for(int i = cnt - 1; i >= 0; i--)        printf("%d ", num[i]);//结果可与2018王道计组复习P45页对比    return 0;}