栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

用C表示负数?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用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)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/366415.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号