- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
考虑以下代码片段:
int main(){
constexpr int x = -1;
if(x >= 0){
constexpr int y = 1<<x;
}
}
GCC 7(可能还有其他版本的 GCC)拒绝编译它并说:
error: right operand of shift expression '(1 << -1)' is negative [-fpermissive]
我可以猜到这可能是从哪里来的:y
上的 constexpr
声明使 GCC 在编译时评估 y
,它可能在哪里是消极的。删除 constexpr
可修复错误。
但是,这是标准未定义的行为吗?条件始终为假,因此永远不会使用 y
的值。
在我的实际代码中,x
是一个模板参数,它可能是负数,也可能不是负数。
最佳答案
GCC 提示是因为你对 y
的定义显然是一个错误的 constexpr
声明。 initialzier 违反了 [expr.const]/2 ,它指定:
An expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine, would evaluate one of the following expressions:
- an operation that would have undefined behavior as specified in Clauses [intro] through [cpp] of this International Standard [ Note: including, for example, signed integer overflow (Clause [expr]), certain pointer arithmetic ([expr.add]), division by zero, or certain shift operations — end note ] ;
所以你不能使用1<<x
初始化 y
.分支永远不会被执行并且可以被消除并不重要。 GCC 仍然有义务验证它在语义上的正确性。
关于c++ - constexpr-evaluating negative bitshift 时的未定义行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46510531/
如果我想对整数 5 进行位移乘以 3,所以 int a = 5; int b = a << 3; ,结果将是 40十进制为 5是101和 40是101000 . 但是,如果我有以下 char 怎么办?
我只是想学习按位/移位操作。 我遇到了下面的程序,但不理解下面程序中的 AND 条件部分(检查器 & (1 0) { return false;
我正在研究字节顺序。我的小端程序可以运行,并提供正确的输出。但是我无法绕过大端。以下是我到目前为止所拥有的。我知道我必须使用位移位,但我认为我在这方面做得不好。我试着问过我的助教和教授,但他们帮不上什
当我对最大正 2 的补码进行位移时,不应该将它位移 31 位来生成有效的 0,因为它以 0111 1111 等开头。 我试过减少类次,但我假设这只是计算机读取不正确。 int main(void) {
我想知道这个函数实际上执行了什么。据我了解,它应该返回 pSrc[1]。 那么为什么它要将 pSrc[0] 左移 8 位,这会将这 8 位清零。当这些零与 pSrc[1] 进行“或”运算时,pSrc[
我有一段代码在执行一些任务后每秒运行约 120 万次,最大的是设置一个 uint8_t 数组,其中包含来自两个 uint32_t 数据的位移数据。摘录代码如下: static inline u
http://www.fastcgi.com/devkit/doc/fcgi-spec.html在 3.4 节中: typedef struct { unsigned char na
当我在 VS 中编写此代码时,它不起作用(“无法将‘int’隐式转换为‘short’。存在显式转换。您是否缺少强制转换?”): short A = 5; short B = 1 << A; 但是这段代
我不明白您何时以及为什么要使用位移运算符进行微芯片编程:例如... SWITCH_DDR &= ~SWITCH_BIT; SWITCH_PORT |= SWITCH_BIT; 为什么要使用这些运算
在寻找将 2 个大数相乘的有效算法时,在论坛中遇到了以下 c 方法:- ... typedef unsigned long long ULL; ULL multiply (ULL a,
我需要用 bitshift 替换 Java 中的 Math.pow。 for (int i = n - 1; i >= 0; i--) Math.pow(16, n - i - 1) 其中 n
我正在设计一款基于多人 RTS 图 block 的游戏,其中所有游戏逻辑均由服务器处理(用 C 语言编写),并且客户端是在 Unity 中制作的,以便于跨平台部署。 我正在设计一个将通过 TCP 发送
我试图从函数返回两个 32 位 int 值(_mouseX 和 _mouseY),方法是先将它们打包成 64 位值,然后在我使用它们时在代码的其他地方解包它们。但是,当我通过这个函数获取数据时,数据完
var1=anyInteger var2=anyInteger (Math.round(var1/var2)*var2) 上面的 JavaScript 移位替代方案的语法是什么? 使用整数而不是 fl
在这个例子中 >>= 做了什么? byte fsr = 2; fsr >>= 2; 我在这里遇到的: https://github.com/sparkfun/MMA8452_Accelerometer
有没有人有如何使用 BitShift 的例子? Pytorch 中的运算符? 最佳答案 Bitwise shift operator performs element-wise operation.
这主要是学术性质的。只是试图理解为什么这不起作用以及如何正确地做到这一点。 我在我的数据库中存储了 0 1 或 2,其中每个代表不同的状态标志。 (这不能在生产中改变) 在我的代码中我有一个枚举 pu
我正在研究基于位板的国际象棋引擎,其中一项大量执行的操作是设置/清除无符号 64 位整数中的位。由于我不太了解哪些代码可以在某些处理器上“更快”地运行,因此我无法完全理解这一点。 设置和清除位是一个非
考虑以下代码片段: int main(){ constexpr int x = -1; if(x >= 0){ constexpr int y = 1<
我有一个问题要问你们,这已经让我抓狂了 2 天了。也许是因为我缺少位移位的基础知识,但不知何故我没有想到它。我想要的是一个简单的程序,它读取 3 个 char 或 uint8_t,将它们存储到一个大的
我是一名优秀的程序员,十分优秀!