C语言输出负数补码

C语言输出负数补码C 语言打印出负数补码最近刚好复习到计组的定点数运算 想着以前写快速幂都是打印出正数的补码 从来没有打印过负数的补码 于是写了几行代码 加深对这方面的理解 要知道的知识数值在计算机表示为补码表示 所以在 C 语言里负数也是以补码存储的了解算术移位和逻辑移位的区别在第三版的神书 CSAPP 里面提到 c 语言标准并没有明确定义对于有符号数使用哪种类型的右移 不幸地 这就意味着任何假设一种或者另一种右移

C语言输出负数补码

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


要知道的知识

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

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

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

代码

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

#include 
     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; } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226477.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:48
下一篇 2026年3月16日 下午10:49


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号