正负用c语言表示,用C表示负数?

小编典典

ISO C(C99 section 6.2.6.2/2在这种情况下,但会延续到标准(a)的后续迭代)指出,实现必须为整数数据类型选择两种不同的表示形式之一,即二进制补码,二进制补码或符号/幅度(尽管这是难以置信的)两者的互补实现可能远远超过其他实现)。

在所有这些表示中,正数是相同的,唯一的区别是负数。

要获得正数的负表示,您:

将所有位取反,然后再加一个二的补码。

将所有位取反以补充。

仅将符号位反转为符号/幅度。

您可以在下表中看到它:

编号 补码| 补语| 符号/幅度

=================================================== = | ====================

5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101

-5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101

请记住,ISO并不要求在表示中使用所有位。他们介绍了符号位,值位和填充位的概念。现在,我从未真正看到过带有填充位的实现,但是,从C99基本原理文档中,他们有以下解释:

假设一台机器使用一对16位short(每个都有自己的符号位)组成一个32位int,而在此32位int中使用时,低位short的符号位被忽略。然后,作为32位带符号的int,在确定32位带符号的int的值时会有一个填充位(在32位中间)。但是,如果将此32位项目视为32位unsigned int,则该填充位对用户程序可见。C委员会被告知,有一台以这种方式工作的机器,这就是向C99添加填充位的原因之一。

我相信他们所指的机器是Datacraft 6024(它是Harris Corp的继任者)。在这些机器中,您有一个用于带符号整数的24位字,但是,如果您想使用更宽的类型,它会将其中两个作为47位值串在一起,而其中一个字的符号位被忽略:

+---------+-----------+--------+-----------+

| sign(1) | value(23) | pad(1) | value(23) |

+---------+-----------+--------+-----------+

\____________________/ \___________________/

upper word lower word

(a)有趣的是,由于实际上很少使用其他两种方法的现代实现方式,人们一直在推动将二进制补码作为一种真正的方法来接受。这在C ++标准中已经走了很长一段路(WG21是负责此工作的工作组),现在显然也考虑将其用于C(WG14)。

2020-09-23

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值