”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么 fmt.Printf 显示负整数的二进制表示与 Go 中预期的不同?

为什么 fmt.Printf 显示负整数的二进制表示与 Go 中预期的不同?

发布于2024-11-08
浏览:532

Why does fmt.Printf show a different binary representation for negative integers than expected in Go?

二进制补码和 fmt.Printf:解开二进制表示之谜

处理有符号整数时,计算机使用二进制补码来表示负值。这与典型的二进制表示不同,其中符号由单独的位指示。例如,在二进制补码中,整数 -5 表示为 1111 1011。

但是,使用 fmt.Printf 打印二进制表示形式可能会产生意外结果。例如,以下代码片段:

var i int8 = -5
fmt.Printf("%b", i)

令人惊讶地输出 -101 而不是 1111 1011。这种差异导致了一个问题:二进制补码是否真正用于内部表示,或者格式是否模糊正确的表示。

为了阐明这个问题,我们需要深入研究 fmt.Printf 如何格式化二进制数字。罪魁祸首在于 fmt.integer 函数,该函数自动将负符号整数转换为正整数。此转换涉及对整数取反并在输出字符串前面添加一个 - 符号。因此,-101 输出是 - 的表示形式,附加到 5 的二进制表示形式之后。

为了进一步演示这一点,将有符号整数转换为无符号整数,然后使用 fmt.Printf 对其进行格式化,生成正确的 Two's补码表示:

var u uint8 = uint(i)
fmt.Printf("%b", u)

输出 11111011,正好是 -5 的补码。

因此,Go 中带符号整数的内部表示遵循补码习俗。格式化有符号整数时看似不正确的二进制表示是由 fmt.integer 执行的自动转换和符号前置造成的。在 Go 中使用有符号整数和二进制表示时,理解这种行为至关重要。

最新教程 更多>
  • 让我们创建一个简单的 React hook 来检测浏览器及其功能
    让我们创建一个简单的 React hook 来检测浏览器及其功能
    用户代理嗅探是最流行的浏览器检测方法。不幸的是,由于多种原因,前端开发不太容易使用它。浏览器供应商不断尝试让嗅探变得不可能。因此,每个浏览器都有自己的用户代理字符串格式,解析起来非常复杂。 有一种更简单的方法可以使用浏览器 CSS API 实现相同的目的,我将向您展示。那么让我们创建浏览器功能检测 ...
    编程 发布于2024-11-08
  • 使用 Golang 的电子商务平台:了解干净的架构
    使用 Golang 的电子商务平台:了解干净的架构
    了解干净的架构 清洁架构(Clean Architecture)由 Robert C. Martin 推广,是一种软件设计理念,它将设计元素划分为环级别。干净架构的主要规则是代码依赖关系只能从外层向内移动。这意味着: 业务规则不依赖于 UI 或数据库。 业务规则对外界一无所知。 U...
    编程 发布于2024-11-08
  • TypeScript 与 JavaScript:开发人员的主要区别
    TypeScript 与 JavaScript:开发人员的主要区别
    JavaScript 是网络的核心语言,而 TypeScript 是基于它的现代增强语言。两者都很强大,但它们的用途略有不同。这是一个快速细分: 1. 类型安全 JavaScript:松散类型。变量可以动态更改类型,从而导致潜在的运行时错误。 TypeScript:静态类型。您定义类...
    编程 发布于2024-11-08
  • JavaScript 能否为不可预测的属性实现动态 Getter 和 Setter?
    JavaScript 能否为不可预测的属性实现动态 Getter 和 Setter?
    JavaScript 可以实现动态 Getters/Setters 吗?动态 getters 和 setters 允许 JavaScript 对象处理超出预定义属性的属性访问和修改。虽然早期的 JavaScript 技术对已知属性使用特定的 getter 和 setter,但本文探讨了为任何未定义的...
    编程 发布于2024-11-08
  • 我的第一个使用 Python 构建的开源项目,通过 CLI 快速检查数据库
    我的第一个使用 Python 构建的开源项目,通过 CLI 快速检查数据库
    我的问题是: 在处理其他项目时,我发现自己总是必须连接并使用 SELECT * 来查看虚拟条目或新用户。我更喜欢使用 CLI 来监视我的数据库条目,特别是因为我正在测试并只是将虚拟用户添加为项目中的第一个普通用户。因此,总是需要连接到 postgres、mysql 并从 CLI 进行 select ...
    编程 发布于2024-11-08
  • PHP,永不倒下的大象!
    PHP,永不倒下的大象!
    照片由 Ben Griffiths 在 Unsplash 上拍摄 PHP是一种广受好评的语言,同时也受到其他人的批评,有人说它正在消亡,但真的是这样吗,值得花时间学习PHP吗? PHP PHP 是 Rasmus Lerdorf 在 90 年代开发的一种编程语言,最初它被开发为一种服务...
    编程 发布于2024-11-08
  • 如何从 Android 应用程序安全访问远程 MySQL 数据库?
    如何从 Android 应用程序安全访问远程 MySQL 数据库?
    使用 JDBC 在 Android 中访问远程 MySQL 数据库:综合分析使用 JDBC API 从 Android 应用程序远程连接到 MySQL 数据库是一种常见的操作移动开发者之间的问题。虽然建立直接连接在技术上是可行的,但它带来了重大的安全和性能问题。安全影响允许 Android 应用程序...
    编程 发布于2024-11-08
  • 使用 CSS 创建自定义鼠标光标
    使用 CSS 创建自定义鼠标光标
    Written by Samson Omojola✏️ Editor’s note: This article was last updated by Njong Emy on 5 August 2024 to update content and code blocks, as well as t...
    编程 发布于2024-11-08
  • 如何修复 Chrome 扩展程序中孤立内容脚本导致的“扩展程序上下文无效”错误?
    如何修复 Chrome 扩展程序中孤立内容脚本导致的“扩展程序上下文无效”错误?
    如何在 Chrome 扩展程序更新后删除孤立脚本问题无意中重新加载 Chrome 扩展程序,尤其是处于开发者模式的扩展程序,可能会创建孤立内容脚本。这些脚本仍然在后台运行,但与扩展的其余部分失去了通信,从而导致诸如“扩展上下文无效”和“未检查的运行时.lastError”之类的错误。解决方案孤立的内...
    编程 发布于2024-11-08
  • 为什么需要设置$GOPATH以及如何有效使用它?
    为什么需要设置$GOPATH以及如何有效使用它?
    在 $GOPATH 的迷宫中导航作为一个初露头角的 Go 开发者,在错综复杂的 $GOPATH 中导航可能会令人畏惧。为了阐明其目的和用法,让我们深入研究有关此环境变量的一些常见问题。为什么在项目根目录设置 $GOPATH?传统上, $GOPATH 对于设置安装 Go 包的工作区至关重要。默认情况下...
    编程 发布于2024-11-08
  • 如何构建数据输入系统(快速简单指南)
    如何构建数据输入系统(快速简单指南)
    三步构建数据输入系统 在本指南中,我们详细介绍了使用 Five 的快速应用程序开发环境构建和部署数据输入系统所需的步骤。 什么是数据输入系统? 数据输入系统是一个旨在捕获、存储、管理和分析数据的平台。这些系统有助于收集用于决策、研究、分析和报告的重要信息。数据输入系统范围从基本的在线表格到与数据库和...
    编程 发布于2024-11-08
  • 使用内联 SVG 时如何确保剪辑路径的响应式对齐?
    使用内联 SVG 时如何确保剪辑路径的响应式对齐?
    具有内联 SVG 的响应式剪辑路径将剪辑路径应用于具有背景的元素时,通常会嵌入 SVG 内联。但是,您可能会遇到响应能力或对齐问题,如下例所示:<header id="block-header"> <svg width="100%" he...
    编程 发布于2024-11-08
  • 使用 PHP 安全地传送电子邮件:使用 SMTP 发送无垃圾邮件的指南
    使用 PHP 安全地传送电子邮件:使用 SMTP 发送无垃圾邮件的指南
    这是如何使用 PHP SMTP 发送电子邮件而不进入垃圾邮件文件夹的分步示例。 我们将使用 PHPMailer 库,它简化了通过 SMTP 发送电子邮件的过程,并有助于提高送达率。按照以下步骤,您将了解如何正确配置 SMTP 以避免电子邮件进入垃圾邮件文件夹。 第1步:安装PHPMa...
    编程 发布于2024-11-08
  • 如何使用 Python 的“locale”模块来格式化货币值?
    如何使用 Python 的“locale”模块来格式化货币值?
    Python 中的货币格式:综合指南将数字格式化为货币是编程中的一项常见任务,尤其是在处理财务数据时。在 Python 中,locale 模块提供了方便的函数来格式化货币值。如何使用 Python 的 locale 模块格式化货币值导入 locale模块:import locale设置区域设置:为了...
    编程 发布于2024-11-08
  • 您可能不知道的关于类型转换的有趣事实
    您可能不知道的关于类型转换的有趣事实
    介绍 类型转换不仅仅是技术上的需要;它有着丰富的历史和许多程序员可能不知道的迷人的细微差别。了解这些可以为编程和软件开发提供更深入的见解。 类型转换的历史视角 多年来,类型转换的概念已经发生了显着的演变。 编程语言中类型转换的演变: 在编程的早期,类型转换是一个手动...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3