C 如何处理补码架构中的数字 0?

2024-02-09

我最近一直在研究表示数字的补码系统,据我了解,数字 0 有两种变体。有负零 (-0) 和正零 (+0)。

我的问题是,在补码架构上,C 语言中究竟如何处理这种异常情况? C 是否区分 -0 和 +0,或者这两种形式都被简单地视为零。

如果在测试为零时 +0 和 -0 都返回 TRUE,那么我想知道如果我们输入 -0 作为输入,下面的示例代码将如何计算整数中设置的位数。

int bitcount(int x)
{
    int b;
    for (b = 0; x != 0; b++)
        x &= (x-1);
    return b;
}

由于 -0 在补码中将所有位设置为 1,因此 -0 应返回任何其他数字中设置的最高位数;然而,这段代码似乎无法通过循环测试条件x != 0,甚至不会进入循环,给出错误的结果。

在 C 语言中,在一个补码架构中,是否有可能使循环条件对正零敏感,如下所示:x != +0另外,如果我从 +0 中减去 1,我会得到 -0 或 -1。换句话说,在补码架构中,+0 - 1 = -0 吗?

总而言之,为了避免在本次讨论中偏离主题太远,我只是想知道 C 如何处理补码架构中数字 0 的特殊性。


在补码架构上,“符号位且所有值位均为 1”的值是“陷阱表示”还是正常值,由实现定义。如果它是一个陷阱表示,则任何尝试anything使用它,甚至首先创建它,都会引发未定义的行为。如果它是正常值,则它是“负零”,并且有一个允许产生它的显式操作列表:

如果实现支持负零,则它们只能通过以下方式生成:

  • &、|、^、~、> 运算符以及产生此类值的操作数;
  • +、-、*、/ 和 % 运算符,其中一个操作数为负零且结果为零;
  • 基于上述情况的复合赋值运算符。

未指定这些情况实际上是否生成负零或正常零,以及存储在对象中时负零是否变为正常零。

(C11/N1570,第 6.2.6.2 节第 3 段。)

似乎也未指定(通过省略)负零是否与正常零比较。类似的规则适用于符号和幅度架构。

因此,这可以归结为,示例代码的行为是实现定义的,并且实现可能无法有效地定义它。您需要查阅这个假设的补码机器的编译器和体系结构手册,以确定它是否执行您希望它执行的操作。

然而,整个问题没有实际意义,因为至少 25 年来没有人制造过非二进制补码 CPU。人们希望 C 标准的未来修订将不再允许这种可能性;它会简化很多事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 如何处理补码架构中的数字 0? 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • 使用 CLion 进行 OpenCV Windows 设置

    我想在 Windows 上为 CLion IDE 设置 OpenCV 我尝试使用 OpenCV 3 1 和 2 4 得到相同的结果 我有 Windows 10 64 位 CLion 使用 cygwin 环境 到目前为止我做了什么 1 从Op
  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • 您可以从基本 Win32 控制台模板应用程序中的 C#/Winrt 组件调用(不是 WinForm/abstractions/wrappers 或使用 C++/Winrt 模板)吗?)

    我有一个现有的程序 win32 x86 控制台应用程序 需要调用托管代码 来自 Net 的 C dll The dll不暴露给 COM 但可以从 C WinRT 组件调用并由 C WinRT 控制台模板应用引用 BUT即使安装了 C Win
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include

随机推荐

  • 系统调用和陷阱之间的区别

    我想知道 MIPS 系统调用和陷阱指令之间是否有任何区别 我找不到任何涉及此的内容 所以我不确定是否有区别 陷阱似乎只是一个条件系统调用 但一些澄清可能会有所帮助 The SYSCALL and TRAP指令都会触发异常 但产生的异常是不同
  • 如何在 JavaScript 中为 Canvas 启用硬件加速

    如何在 JavaScript 中为 HTML5 画布启用硬件加速 或者说这在 JavaScript 中是不可能的吗 我记得我在某处读到过使用 CSS 或 Webgl 来做到这一点 但我不记得了 只要这个问题是关于 Canvas 的 java
  • 带有 shell 命令和变量的 c makefile

    这是来自我用来构建程序的 bash 脚本 dateString date Y m d H M S revision svn info grep Revision tr d alpha echo define VERSION DATE dat
  • API 什么时候会被过度设计? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • x 是 Javascript FF/Safari 中的保留关键字,而不是 IE 中的保留关键字吗?

    Web 应用程序的网页显示了一个奇怪的错误 我逐步删除了所有 HTML CSS JS 代码 得到了下面的基本且简单的代码
  • 使用 Python 和 SetWindowsHookExA 应用低级键盘挂钩

    所以我试图弄清楚如何使用 Python 注册全局键盘钩子 根据我的阅读 DLL 中没有回调似乎没问题 如果您使用WH KEYBOARD LL 我不能肯定地确认这一点 但我发现令人鼓舞的是 我没有像我尝试挂钩时那样收到 1428 错误WH C
  • 防止 Google App Engine Cron 作业创建多个实例(从而耗尽我所有的实例时间)

    与这个问题非常相关 如何防止我的 Google App Engine cron 作业耗尽我的所有实例时间 https stackoverflow com questions 8670532 how can i prevent my goog
  • 如何使用 knit/rmarkdown 自定义图形 LaTeX

    我想在通过 LaTeX 生成 pdf 文件的 rmarkdown 文档中使用 ggplot2 创建的图形在浮动中创建页脚 我的问题 rmarkdown knitr 中有没有办法在图形环境中添加更多 LaTeX 命令 具体来说 我想找到一种使
  • JPA 在使用 FlushModeType.AUTO 进行本机查询之前不会刷新

    在我们的项目中 我们使用hibernate 5 0 12和Spring data Jpa 我发现jpa不会在本机查询之前调用flush 但是在JPA规范中 我读到FlushModeType AUTO在每个查询 JPQL或本机SQL 之前调用
  • 如何在c中生成NaN浮点数?

    float f float a if f lt 0 else if f 0 else if f gt 0 else printf NaN n f不会大于 等于 小于0如果它是一个NaN 但如何生产这样的f首先 我尝试了各种方法来制作NaN
  • 捕获所有异常是好是坏?

    我在多个项目中看到一种捕获所有异常来捕获所有意外异常 这样应用程序就不会崩溃 我通常会看到这样的情况 AppDomain CurrentDomain UnhandledException new UnhandledExceptionEven
  • 从另一个类 swift 调用函数

    我无法从另一个类 Menu swift 调用 GameViewController swift 中的函数 我这样调用该函数 class Menu SKnode func scoreAction sender UIButton self bu
  • Django 视图被调用两次(双 GET 请求)

    我正在 Django 中创建一个分类网站 单一视图功能可处理全球列表 城市列表 仅易货全球列表和仅易货城市列表 这个视图被称为ads url 模式按以下顺序编写 请注意 每个模式都有唯一的名称 尽管它与相同的名称相关联 ads view u
  • 如何确定分配的 C 缓冲区的大小? [复制]

    这个问题在这里已经有答案了 我有一个缓冲区 想要进行测试以查看缓冲区是否有足够的容量 即找到可以添加到缓冲区的元素数量 char buffer char malloc sizeof char 10 Doing a int numElemen
  • iOS 中动画图像的最佳实践 - UIImage 还是 UIImageView?

    抱歉 如果问题有点主观 但我找不到有关该主题的任何信息 问题很简单 以下哪一项是 最佳 即最佳性能 无论选择什么解决方案 我都想在 UIImageView 中显示图像 self imageView image UIImage animate
  • .NET Rx 相对于经典事件的优势?

    NET 4 0 测试版 2 http msdn microsoft com en us vstudio dd582936 aspx has 介绍 http blogs msdn com bclteam archive 2009 10 21
  • 在控制器上声明 ViewBag

    我在控制器的方法中多次使用具有相同消息的 ViewBag Message 可以在类的顶部声明 ViewBag Message 这样就可以在整个控制器中使用而无需重复代码吗 假设 Razor 语法可以实现这一点 string pageMess
  • 使用数据库中的 jquery 动态复选框 html

    我有一些像这样的html div class control group div
  • 有条件地禁用 Angular 中的路由器链接

    我在 Angular 项目 使用 Angular 2 中有许多链接 类似于 a Link a 我想根据上下文 状态禁用其中一些 通过更改颜色并防止操作发生 对于样式 我已添加到链接 class disabled isValidLink 这让
  • C 如何处理补码架构中的数字 0?

    我最近一直在研究表示数字的补码系统 据我了解 数字 0 有两种变体 有负零 0 和正零 0 我的问题是 在补码架构上 C 语言中究竟如何处理这种异常情况 C 是否区分 0 和 0 或者这两种形式都被简单地视为零 如果在测试为零时 0 和 0