- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
题
作为一个刚起步的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/
我声明了一个通用结构和这些结构的数组,如下所示: struct A { int x,y,z; char a,b,c; }; struct A *str_arr[5]; 根据我的理解,s
我对 CUDA 编程指南 4.0 部分 5.3.2.1 中的以下语句感到困惑 在性能指南的章节中。 Global memory resides in device memory and device
我想知道这两者之间有什么区别: addCompilerPlugin("org.typelevel" %% "kind-projector" % "0.11.3" cross CrossVersion.
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 5 年前。 Improv
结构体的析构函数: 您能否指定必须在结构的析构函数中显式处理的每种数据类型? struct Node { int val; // representing any
我试图通过创建我自己的同名扩展方法来修改现有扩展方法的行为。我知道只要方法签名不同,这是可能的。我还知道调用哪个方法取决于签名的关闭程度。 如果我有 public void DoStuff(this
取自:https://www.gnu.org/software/libc/manual/html_node/Nonreentrancy.html For example, suppose that t
谁能帮忙解释一下 bind 在这种情况下的用途是什么? Add New https://youtu.be/OKRu7i49X54?list=PL6gx4Cwl9DGBuKtLgPR_zWYnrwv-J
目前我将 glFrustum 设置为 glFrustum(0, 100.0, 0, 100.0, -50, 50); 我的图像是一个矩形立方体,尺寸为:当形状的尺寸小于查看框时,为什么我看不到图像?
我面临着与该线程中描述的类似的问题: Can Enunciate generate docs for an API that handles generic types? 我正在使用 enunciat
有人能解释一下这段代码是如何工作的吗? PRE_PROC_EXE := $(shell which pre_proc.pl) PRE_PROC2_EXE := $(shell
使用 Prompter 方法在 FormFlow 中发送自定义卡片。查看代码发现有一个 GenerateMessages() 方法,对于下面的代码,它总是返回 false。有人可以阐明为什么/何时使用
我在谷歌上找不到任何东西。 我有这段代码: Random r = new Random(); int[] output = Enumerable.Range(0, 11).Select(x => x
我正在阅读 Eric Meyer 撰写的 CSS 权威指南第 3 版。 他关于字体大小的部分(第 107 页)指出字体大小决定了 em 框。如果我这样做: span { font-size: 10px
我对ElasticSearch的使用有些困惑。我现在有一个带有关系数据库(Ruby on Rails)的应用程序(Mysql),我正试图从ElasticSearch提供的搜索功能中受益。我仍然想像以前
有Java背景,但是从未开发过 Web 客户端(即由浏览器运行的脚本),但是java小程序(我怀疑是,嗯,老式的(对吧?)或者其他我显然会将它们用于以下一些用途) 然后考虑以下场景: 仅客户端应用程序
假设我有一个子函数: function Child() {} 并且有一个父函数: function Parent() {} 然后我将 Child 的原型(prototype)设置为 Parent 的新
程序如下: #include using namespace std; class X { int no; public: X(int n=1) : no{n} {} X(const
阅读文档: del: Deletion of a target list recursively deletes each target, from left to right. 你能解释一下为什么这
我对 C/C++ 中的悬挂指针有点困惑 void remove(){ Node* curr = new Node(10); Node* pt = curr; delete curr; // do so
我是一名优秀的程序员,十分优秀!