Art*_*tur 6 c c++ hardware bit-manipulation undefined-behavior
我的问题与此问题有关,并且几乎没有问题.
对我来说最明显的(意味着我会在我的代码中使用它)解决上述问题就是这样:
uint8_t x = some value;
x = (int8_t)x >> 7;
Run Code Online (Sandbox Code Playgroud)
是的,是的,我听到你们所有人......未定义的行为,这就是为什么我没有发布我的"解决方案".
我有一种感觉(也许只是我生病的头脑),术语"未定义的行为"在SO上被过度使用,只是为了证明如果问题被标记为c/c ++,那么就可以为某人辩护.
所以 - 让我们(暂时)抛开C/C++标准,思考日常生活/编程,真正的编译器实现以及它们为现代硬件生成的代码.
考虑到以下因素:
>>为有符号类型的算术移位和无符号类型的逻辑移位.div时发出类似于低级别的指令>>(我们在这里不讨论运算符重载).所以...有什么(任何当代编译器,硬件)的行为与上面提到的不同?简单地说,我是否应该担心右移有符号值而不是转换为算术移位?
我的"解决方案"仅在许多平台上编译为一个低级指令,而其他平台则需要多个低级指令.你会在代码中使用什么?
请真相;-)
为什么要担心签名类型的"未定义行为"?
因为它没有真正的问题是如何明确定义的任何特定的未定义行为是现在 ; 关键是它可能会在未来的任何时候破裂.您依赖于可能因任何原因或无理由而在任何时候被优化(或未优化)的副作用.
另外,在使用我不应该使用的东西之前,我不想让有人详细了解许多不同编译器的实现,所以我跳过它.