- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
是否有可能将 int32_t
显式转换为 uint32_t
,以改变值的位表示?
例如,假设我有以下 union :
typedef union {
int32_t signed_val;
uint32_t unsigned_val;
} signed_unsigned_t;
规范是否保证这些代码段具有相同的行为?
uint32_t reinterpret_signed_as_unsigned(int32_t input) {
return (uint32_t) input;
}
和
uint32_t reinterpret_signed_as_unsigned(int32_t input) {
signed_unsigned_t converter;
converter.signed_val = input;
return converter.unsigned_val;
}
我在这里考虑 C99。我见过几个类似的问题,但他们似乎都在讨论 C++,而不是 C。
最佳答案
将有符号整数类型转换为相同宽度的无符号整数类型可以改变表示形式,前提是您可以找到具有符号大小或补码符号表示形式的机器。但是类型 int32_t
和 uint32_t
保证是二进制补码表示,因此在那种特定情况下,表示不能改变。
将有符号整数转换为无符号整数在标准第 6.3.1.3 节中有明确定义。相关算法是第二段:
- When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged.
- Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.
- ...
因此,如果负数存储在 2 的补码中,则结果实际上必须是逐位复制的结果。符合要求的实现允许使用符号幅度或补码;在这两种情况下,负整数的表示都必须修改为转换为无符号。
在评论中总结了一段冗长而有趣的讨论:
在 OP 中使用 int32_t
和 uint32_t
的精确示例中,表示必须相等如果程序编译 ,因为 C99 要求 int32_t
和 uint32_t
的长度正好是 32 位且没有填充,并且要求 int32_t
使用 2 的补码表示。但是,它并不要求这些类型存在;一个补码实现可以简单地不定义 int32_t
,并且仍然符合。
我对类型双关的解释低于水平规则。 @R .. 向我们指出了 Defect Report从 2004 年开始,这似乎表明类型双关是 OK 或触发陷阱,这比未定义的行为更接近于实现定义的行为。另一方面,该 DR 的建议解决方案似乎不在 C11 文档中,该文档说 (6.2.6.1(5)):
Certain object representations need not represent a value of the object type. If the stored value of an object has such a representation and is read by an lvalue expression that does not have character type, the behavior is undefined.
在我看来,如果其中一种参与类型具有陷阱表示,则类型双关是未定义的行为(因此如果阅读类型没有陷阱,则不是未定义的行为表示)。另一方面,没有类型需要有陷阱表示,只有少数类型被禁止有陷阱表示:char
和 union
类型——但不是 union 类型——以及实现的 [u]int*K_t
类型。
我之前关于类型双关的声明如下:
存储双关 union 具有未定义的行为。但是在不调用 lagartos voladores 的情况下,如果某个值以无符号形式存储然后以带符号形式访问,则符号幅度或补码机器可能会抛出硬件异常。
ones-complement 和 sign-magnitude 都有两种可能的 0
表示形式,一种表示每个流行的符号位。带负号位的,“负零”,允许作为“陷阱值”;因此,访问作为有符号整数的值(甚至只是复制它)可能会触发陷阱。
虽然 C 编译器有权禁止陷阱,比如通过使用 memcpy 或未签名的操作码复制值,但它不太可能这样做,因为这会让知道她的程序正在运行的程序员感到惊讶在带有负零陷阱的机器上,并期望陷阱在非法值的情况下触发。
关于将有符号转换为无符号时,C 编译器能否更改位表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18928220/
给定一个字符串,例如 s="##$$$#",我如何找到索引之前的“#”符号数等于“”数的索引$"符号在索引之后? 示例:如果 s="##$$$#",则输出将为 2。 解释:在索引 2 之前我们有 2
在本教程中,您将借助示例了解 JavaScript 符号。 JavaScript 符号 JavaScript ES6 引入了一种新的原始数据类型,称为 Symbol(符号)。符号是不可变的(不能更改)
在“函数编程的工艺”一书中,符号 '>.>' 将函数连接在一起,与 '.' 的方向相反。但是当我使用 ghci 实现它时,它显示了超出范围的错误 '>.>'。为什么?它是不再使用的旧符号吗? 最佳答案
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我需要从向量中删除 \"。这是我的数据: data <- c("\"https://click.linksynergy.com/link?id=RUxZriH*PWc&offerid=323058.1
我在 Nginx 配置中使用正则表达式来捕获文件 URL,但如果文件 URL 包含 # 符号,正则表达式模式将不会捕获它。 这里是nginx的配置部分。 location ~ ^/p/(?[\w\-=
如何使 & 符号在此图表的第一组条形/列下正确显示: http://jsfiddle.net/VxbrK/2/ 应该是“Apples & Oranges”而不是“Apples & Oranges”。
**在verilog中是什么意思? 我为测试台提供了以下逻辑 localparam NUM_INPUT_BITS = 1; localparam NUM_OUTPUT_BITS
我有一个使用正则表达式来验证电子邮件地址的方法。 public String searchFormail(String searchWord) { Pattern pattern = Patt
我想将一个字符串拆分为数字部分和文本/符号部分我当前的代码不包含负数或小数,并且表现得很奇怪,在输出的末尾添加了一个空列表元素 import re mystring = 'AD%5(6ag 0.33-
我有一些代码需要从数组中选择一个随机字符串,但它一直返回单个字母或数字。如何解决这个问题? var name = ["Yayek", "Vozarut", "Gezex",
我刚开始使用 Python,我在考虑应该使用哪种表示法。我读过 PEP 8关于 Python 符号的指南,我同意那里的大多数内容,除了函数名称(我更喜欢混合大小写风格)。 在 C++ 中,我使用匈牙利
在用 C# 编写代码时,我错误地在 if 语句中的变量前添加了一个符号(而不是感叹号)。 bool b = false; if (@b) { } 我很惊讶它编译成功,没有任何错误。 我想知道:上面的代
本文实例为大家分享了特殊字符替换电话号码中某一部分的方法,ios利用-号替换电话号码中间四位,供大家参考,具体内容如下 1、效果图 2、代码 rootviewcontroll
当我使用“x”和“z”作为符号时,这段代码没有问题: from sympy import * x, z = symbols('x z') y = -6*x**2 + 2*x*z**0.5 + 50*x
我需要从文本中删除标点符号: data <- "Type the command AT&W enter. in order to save the new protocol on modem;"
我有几个数字是 numeric 类。下面的例子。 df = c(12974,12412,124124,124124,34543,4576547,32235) 现在我想在每个数字前添加 '$' 符号而不
我有一个 highcharts 图例,其中符号以不同的大小显示,因为它们在实际图表中的大小不同。不幸的是,当数据点的大小增加时,它们也会在图例中增加。无论数据点大小如何,我都希望图例符号保持相同的大小
我需要使用包含平均值+-SD的标题。到目前为止,我只能得到以下信息: "Mean +- SD or N (%)" [1] "Mean +- SD or N (%)" 如何直接使用“+-”符号?您知道一
使用 XSLT 和 XPath 1.0,我有一个要转义的字符串以用于 URL,例如: one word & another 因此,描述元素的 text() 应该进行 URL 转义。 我该怎么做
我是一名优秀的程序员,十分优秀!