gpt4 book ai didi

c++ - 整数的按位运算在项目的 DEBUG 和 RELEASE 版本中表现不同

转载 作者:行者123 更新时间:2023-11-30 02:00:19 25 4
gpt4 key购买 nike

我在 Windows 8 64 位上使用 Visual Studio 2012。我有这两种方法:

void Node::setState(States state, bool value) {
if (value) {
states_ |= 1 << state;
}
else {
states_ &= ~(1 << state);
}
}

bool Node::getState(States state) {
return (states_ & (1 << state)) != 0;
}

状态枚举:

enum States {
UPDATABLE = 0x01, // Node data update.
RENDERABLE = 0x02, // Node rendering on screen.
TRANSFORMABLE = 0x04, // Position, rotation and scaling update.
POSITION = 0x08, // Position update.
ROTATION = 0x10, // Rotation update.
SCALING = 0x20 // Scaling update.
};

声明整数初始化:

states_(TRANSFORMABLE | RENDERABLE |
UPDATABLE | POSITION | ROTATION | SCALING)

现在问题出在这部分代码:

LOGI("SETTING SCALING FOR NODE: %s", node->getName().c_str());
node->setState(Node::SCALING, true);
if (node->getState(Node::SCALING)) {
LOGI("NODE WILL BE UPDATED.");
}
else {
LOGI("NODE WILL NOT BE UPDATED.");
}

在 Debug模式下我得到“节点将被更新”,在发布时我得到“节点将不会被更新”。这是什么原因造成的?

最佳答案

SCALING 是一个 32 位有符号整数,值为 0x20。您将 1 左移 0x20 (32) 位位置。这意味着您将它移动得太远,导致未定义的行为。

标准相关引述:

The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with zeros. If E1 has an unsigned type, the value of the result is E1× 2E2, reduced modulo one more than the maximum value representable in the result type. If E1 has a signed type and nonnegative value, and E1× 2E2 is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined.

关于c++ - 整数的按位运算在项目的 DEBUG 和 RELEASE 版本中表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15288044/

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