gpt4 book ai didi

c - 阐明按位运算符,非负操作数和类型转换如何交互

转载 作者:行者123 更新时间:2023-12-01 13:44:54 24 4
gpt4 key购买 nike



作为一个刚起步的C语言律师,我遇到了一种情况,即我不确定我是否了解C规范在逻辑上可以正确保证。

据我了解,“按位运算符”(&|&)将按直觉预期在具有C整数类型(char / short / int / long / etc,是否为signed非负值上工作) )-不管基础对象的表示形式如何。

这是对C中严格定义的行为的正确理解吗?

重点

在许多方面,该问题归结为是否允许一个符合实现的实现将两个非陷阱,非负值作为按位运算符的操作数,并产生陷阱表示结果(来自操作本身,而不是来自于赋值/解释)结果归为不适当的类型)。



考虑以下代码:

#include <limits.h>
#define MOST_SIGNIFICANT_BIT = (unsigned char )((UCHAR_MAX >> 1) + 1)

/* ... in some function: */

unsigned char byte;
/* Using broad meaning of "byte", not necessarily "octet" */
int val;

/* val is assigned an arbitrary _non-negative_ value at runtime */

byte = val | MOST_SIGNIFICANT_BIT;

请注意上面的注释,即 unsigned在运行时接收到 非负值(需要花言巧语:该值可以由 val的类型表示)

我的期望是 val设置了最高有效位,而低位是 byte数值底部 CHAR_BIT - 1位的纯二进制表示形式(无填充位或陷阱表示)。

即使 val的类型更改为任何其他整数类型,我也希望这保持不变,但是我希望,只要 val的值变为负数(对于所有实现,都不能保证任何结果),或者 val更改为任何非整数类型(违反了C的按位运算符定义的约束)。

自我回答

我将对当前理解的解释发布为答案,因为我对此很有信心,但是我正在寻求对我的任何误解的更正,并且会接受任何更好/更正的答案,而不是我的。

最佳答案

从许多方面来看,这个问题归结为是否允许符合的实现将两个非陷阱,非负值作为按位运算符的操作数,并产生陷阱表示结果

C11第6.2.6.2节对此进行了介绍(C99类似)。有一个脚注阐明了更多技术性文本的意图:

无论如何,对有效值的算术运算都不能生成陷阱表示,除非作为异常条件(例如溢出)的一部分,并且这对于无符号类型不会发生。

按位运算符是算术运算as discussed here

在此脚注中,“陷阱表示”不包括特殊情况“负零”。负零可能会或可能不会导致UB,但它有自己的文本(也在6.2.6.2中)与陷阱表示文本分开。

因此,您的问题实际上可以得到有符号和无符号值的解答;唯一危险的情况是“负零”的可能性。 (这不会出现在非负输入中)。

关于c - 阐明按位运算符,非负操作数和类型转换如何交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36685927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com