溢出的签名/未签名作业及其结果

2023-12-21

我正在阅读 Stroustrup 的书“C++ 编程语言第 4 版”,并且有三个关于溢出赋值的问题(特别是对有符号/无符号字符,如书中所示)。首先,根据标准5/4段:

如果在计算表达式时,结果不是 数学定义或不在可表示值的范围内 它的类型,行为未定义.

(除非目标变量是无符号的 - 在这种情况下结果是明确定义的)。但这个定义也适用于作业吗?

因为我认为书中有很多相反的说法,都在第六章。第一个与前述段落相对应,但以下评论则不然:

三者的变量char类型可以自由分配给每个 其他。但是,为 a 指定太大的值signed char还是 不明确的。例如:

void g(char c, signed char sc, unsigned char uc)
{
    c = 255; //implementation-defined if plain chars are signed and have 8 bits
    c = sc; //OK
    c = uc; //implementation-defined if plain chars are signed and if uc's value is too large
    sc = uc; //implementation-defined if uc's value is too large
    uc = sc; //OK: conversion to unsigned
    sc = c; //implementation-defined if plain chars are unsigned and if c's value is too large
    uc = c; //OK: conversion to unsigned
}

第一个问题:既然分配太大的值是UB,那么为什么评论说它是实现定义的?

接下来我们有以下示例:

具体来说,假设一个char是8位:

signed char sc = -160;
unsigned char uc = sc; //uc == 116 (because 256-160==116)
cout << uc; //print 't'

第二个问题:除了第一个作业据说是 UB 之外,作者究竟使用了什么公式来得出 116?在我的测试中,uc得到的值为 96。

最后引用:

一个整数可以转换为另一种整数类型。如果 目的地是signed,如果可以的话,该值不变 以目的地类型表示;否则,该值为 实现定义:

signed char sc = 1023; //implementation-defined

合理的结果是 127 和 -1。

第三个问题:再说一次,除了这与之前关于 UB 所说的相反之外,为什么可能的结果是 127 和 -1?我猜这与一个和两个补码有关,但是使用的精确公式是什么?


1)实现定义的是“一类UB”——换句话说,它仍然是UB,只是实现负责解释它是如何工作的,而不是“你根本不能依赖这个操作”。因此,如果您分配超出范围,编译器仍然可以让您的计算机爆炸char价值观。但实现也可以定义“将其截断为 8 位等效值”。

2) 256 - 160 = 96 在我的计算器上。我敢打赌,这也是你的。也许作者有不同的计算器?或者是最后一分钟从 -150 更改为 -160 的事情之一,它忘记更改最终结果。

3)由于它是“实现定义的”,因此它最终可能几乎是任何东西。由于该值是十六进制的 0x3ff,因此我们可以将 0xff 或 0x7f 想象为合理的值,具体取决于实现决定如何执行此操作。我预计大多数编译器将使用 0xff 值。

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

溢出的签名/未签名作业及其结果 的相关文章

  • LINQ TO ENTITY 无法与枚举类型进行比较

    下面是枚举叶子 public enum Leaves Annual 0 Medical 1 Hospitalization 2 Unpaid 3 下面是linq查询 public ActionResult ApproveLeave int
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • Windows Server / Datacenter:设置 CPU 关联性 > 64 个核心

    SetThreadAffinityMask 允许为 64 个逻辑核心 处理器 设置关联掩码 但是 Windows Datacenter 最多可以有 64 个 CPU 每个 CPU 都有多个内核 请参阅here http social tec
  • DataGridView 自动完成组合框列不保留初始单元格离开时的值

    我有一个带有自动完成组合框列的绑定 dataGridView 并且自动完成功能正在工作 只是我观察到一种有点令人恼火的行为 当我第一次在自动完成单元格中键入文本并使用 tabKey 移动到下一个单元格时 我的选择不会保留 我选择的内容将被清
  • 从对象中获取类型正在返回运行时类型[重复]

    这个问题在这里已经有答案了 我有一个简单的功能 public string getType object obj Type type obj getType return type FullName 如果您在运行时创建的字符串对象上使用此函
  • 为什么 C++11/Boost `unordered_map` 在擦除时不重新散列?

    我想知道为什么 C 11 和 Boost 的 hashmap 在通过迭代擦除元素时不会调整大小 即使这在技术上不是内存泄漏 我认为这可能是应用程序中的一个严重问题 这对我来说是一个隐藏的问题 很难追踪它 并且它实际上可能会影响许多应用程序
  • 以 ASCII 字符串形式获取 MemoryStream 内容的快速方法

    我在 MemoryStream 中有一个 JSON 字符串 我使用以下代码将其作为 ASCII 字符串获取 MemoryStream memstream new MemoryStream Write a JSON string to mem
  • JObject ToString 与 StringEnumConverter 不起作用

    我正在尝试序列化一个匿名类 如下所示 public enum ErrorCode A B C var response JObject FromObject new Error new Message Test Code ErrorCode
  • boost::unordered_map 是...有序的吗?

    我有一个 boost unordered map 但它看起来是有序的 给我一种压倒性的 你做错了 的感觉 为什么输出是这样的 我希望底层的哈希算法能够随机化这个顺序 include
  • 有没有一种方法可以在不测试整个应用程序的情况下对类库(通用 Windows)进行单元测试?

    我需要进行单元测试Class Library Universal Windows 但是从 添加新项目 窗口中 我只看到了这一点 该项目使用应用程序容器运行所有测试 它始终打开一个应用程序 由于我不需要所有这些开销 我想知道是否有一种方法可以
  • 提高 ASP.NET/C# 编译速度的最佳方法是什么?

    更新 请将您的答案集中在硬件解决方案上 您使用什么硬件 工具 插件来提高 ASP NET 编译和首次执行速度 我们正在寻找固态硬盘来加快速度 但现在价格确实很高 我现在有两个 RAID 0 的 7200 rpm 硬盘 但我对性能不再满意 所
  • C# 中的异步方法如何工作?

    我在我的一些项目中使用异步方法 我喜欢它 因为它使我的应用程序更具可扩展性 但是 我想知道异步方法如何在后台真正工作 NET 或 Windows 如何知道调用已完成 根据我进行的异步调用的数量 我可以看到创建了新线程 但并不总是 为什么 此
  • 如何获取 TFS 2013 中所有用户的列表

    我正在使用 Team Foundation Server TFS 2013 和 Visual studio 2012 我需要 TFS 中所有用户的列表 有没有办法使用C 获取TFS中的所有用户 从TFS 2010获取用户列表 您可以尝试使用
  • 使用 Entity Framework Core 在运行时迁移

    我正在将 PHP Illuminate 应用程序移植到 ASP NET Core EF Core 其中一部分由类似 Wordpress 的安装过程组成 该过程要求提供数据库凭据 然后创建应用程序运行所需的表 本质上 我想在运行时运行某种迁移
  • 对 MFC UI 应用程序进行单元测试吗?

    如何对大型 MFC UI 应用程序进行单元测试 我们有一些大型 MFC 应用程序已经开发了很多年 我们使用一些标准的自动化 QA 工具来运行基本脚本来检查基础知识 文件打开等 这些由 QA 小组在日常构建后运行 但我们希望引入一些程序 以便
  • 虚拟键盘(类似 Swype 键盘)Windows 窗体应用程序 C#

    我正在尝试使用 c 在 Windows 窗体中创建一个类似 swype 的键盘 我有两个问题 A 我无法重现手指滑动动作 b 我无法识别不同按键下的字母 对于第一个问题 我使用了 Graphics 类和 Pen 类 并像这样使用它 bool
  • 有C语言的解释器吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话
  • 如何在 C++ 中打印变量的名称? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中获取变量名称的编程方法 https stackoverflow com questions 1623111 programmatic way to get variable name in c
  • 在.Net中使用ObjectCache缓存对象并设置过期时间

    我陷入了一个场景 我的代码如下 更新 它不是关于如何使用数据缓存 我已经在使用它及其工作 它是关于扩展它 以便该方法在到期时间和从外部源获取新数据之间不会进行调用 object string this GetDataFromCache ca
  • 我如何将 C++ 与 VALA 混合起来

    我需要用 C 编写跨平台的 GUI 应用程序 但由于 C 的大多数 GUI 库都有点乏味 而且我对 C NET 非常熟悉 我发现使用 GTK 的代码 Vala 代码非常有趣 并且与其他方式相比有点容易 那么我该如何将 VAlA 与 C 混合

随机推荐

  • ajax中的非法调用错误(Jquery 1.7.1)

    我正在尝试使用 jquery 发布 ajax 请求 var peName document getElementById peName value var peSubName document getElementById peSubNam
  • 通过 Visual Studio 进行 C++ 调试 - 向量大小变化的观察点

    我想用我的向量探索这些变化 因此我想在向量大小上设置一个点 因此 Visual Studio 将让我在每次大小更改后查看向量中的内容 我怎样才能做到这一点 在此链接中 http www codeproject com Articles 35
  • C# 如何在 windows xp/7 中禁用屏幕键盘声音

    我有一个在 Windows XP 7 上运行的 C 应用程序 我使用屏幕键盘 启用声音时会出现延迟 从而导致问题 我想禁用声音 如何通过我的 C 应用程序代码禁用声音 有任何想法吗 您可以从注册表禁用它 HKEY CURRENT USER
  • Apache hive 错误 此版本的 hadoop 不支持合并凭据

    我使用的是hadoop 1 2 1 hbase 0 94 14和hive 1 0 0 我的集群中有三个数据节点 还有三个区域服务器 我必须将一些数据从 hbase 导入到 hive 我已经成功配置配置单元 但是当我运行命令计数 no 时 h
  • 从 Xcode 5 导入 SVN 中的项目

    在 xcode 4 管理器中有一个 导入 按钮 在 xcode5 中如何导入 svn 存储库中的项目 thanks 这个问题有点令人困惑 所以如果这不完全是您所需要的 请告知 否则 请随意接受答案 令人困惑的是 您描述的 Xcode 4 工
  • 哪个版本的 Maven 与 Java 6 兼容?

    我必须在一个需要 java 6 才能运行的旧项目中工作 因为其中引用了已在未来版本中删除的已折旧的 sun 类 作为该过程的一部分 我将系统路径中的 jdk 从 8 更改为指向 java 6 jdk 这样做之后我得到 Exception i
  • EaselJS - 拖动缩放父级的子级

    注意 此问题现已解决 请参阅下面我的回答中的 修复 如果您认为合适 请随意注入任何进一步的知识 首先 我一直在研究和谷歌搜索 localToGlobal localToLocal 和 globalToLocal 但我对这些方法的理解还不足以
  • 无法将地图放入接收器上下文中

    我正在尝试查看在接收器上下文中抛出地图的方法 在这段代码中 class Sunk has titanic method sink say Sinking titanic Sunk new titanic for 1 3 1 3 map Su
  • 返回时未调用 ngOnInit

    我注意到ngOnInit 当我返回到已经实例化的页面时 方法不会被调用 我必须使用其他方法吗 我需要一个每次访问特定页面时都会调用的方法 EDIT已经测试过onPageWillEnter 但它在 Ionic 2 中没有被触发 Check 生
  • PHP中的短语分割算法

    不知道如何解释 让我们举个例子 说我想拆分句子 今天是个好日子 into today today is today is a today is a great today is a great day is is a is a great
  • 如何将图像调色板缩小为特定颜色?

    我正在使用 Python 程序来创建十字绣方案 并且需要将图像中的颜色减少为特定的牙线颜色像这样 http www dmc usa com Products Needlework Threads Embroidery Threads med
  • javascript方法链中的输入参数是如何填充的?

    我正在尝试真正了解 javascript 工作原理的细节 在方法链接期间 有时一个方法会返回到另一个具有命名输入参数的方法 例如 在 D3 中 模式如下所示 d3 select body selectAll p data dataset e
  • 使用 Backbone.js 的 JS 模板系统

    我正在寻找一些好的模板系统 可以与 Backbone js 等 MVC 框架一起使用 我知道这样一个系统 jQuery 模板 然而 由于某些原因 它已经停止 因此我正在寻找其他一些不错的选择 请建议从视图角度足够灵活的东西 例如 基于某些逻
  • Spring Boot属性在初始化时加载,并尊重所有属性并根据属性文件中的值控制@Aspect

    我们正在使用从外部文件加载属性 PropertySources 现在我想启用 禁用 Aspect基于属性 我尝试使用 ConditionalOnExpression这不起作用 我通过创建一个 bean 进行了同样的尝试propertypla
  • “您可能需要一个额外的加载器来处理这些加载器的结果。”

    我目前正在尝试为 ReactJs 构建一个状态管理库 但是一旦我将它实现到我的 React 项目中 使用create react app 它开始丢弃此错误 Failed to compile path to agile dist runti
  • QProcess 在未 waitForFinished() 时不发出信号

    下面的代码中省略了waitForFinished 使 QProcess 停止发出信号 这到底是怎么回事 这是 Qt 的错误吗 5 7 请注意 此代码与 QtConcurrent 并行运行 但这不应该改变任何事情 不是吗 Afaik 在其他线
  • [decl.constexpr].5 到底是什么意思?

    该标准关于常量表达式函数 decl constexpr 第 5 点规定 对于非模板 非默认 constexpr 函数或非模板 非默认 非继承 constexpr 构造函数 如果不存在参数值 则函数或构造函数的调用可以是核心常量的计算子表达式
  • 导出到 Excel 不适用于 SSL (https) 下的 IE

    我一直在尝试修复安全网站 https 上的某些内容 该网站是一个生成 CSV 文件的 导出到 Excel 按钮 它适用于 Firefox Chrome 等 但不适用于 Internet Explorer 我已经更改了标头 消除了无缓存 还编
  • 自移动批处理文件

    我正在寻找一种方法让批处理文件在执行后将其自身移动到已知位置 自动移动 似乎是最恰当的名字 但我确信它有一个技术术语 我想移动批处理文件after所有其他代码都已运行 move C temp move me bat D temp move
  • 溢出的签名/未签名作业及其结果

    我正在阅读 Stroustrup 的书 C 编程语言第 4 版 并且有三个关于溢出赋值的问题 特别是对有符号 无符号字符 如书中所示 首先 根据标准5 4段 如果在计算表达式时 结果不是 数学定义或不在可表示值的范围内 它的类型 行为未定义