【发布时间】:2019-03-24 22:57:14
【问题描述】:
我正在尝试旋转一个有符号字符 (*c),它在二进制中是 10011010,右 4 个 (numRotate) 位置。换班后的期望结果是10101001。我目前拥有的代码是:
void right(char *c, int numRotate) {
*c = (*c >> numRotate) | (*c << (8 - numRotate));
}
根据我所学到的,这显然应该可以正确地完成我想要的转变。相反,我得到的结果是11111001。我不确定出了什么问题。 signed 与 unsigned char 数据类型有问题吗?我看过的所有资源都只使用无符号数据类型。
【问题讨论】:
-
有符号或无符号数据类型的事实与位顺序无关。好吧,除非您对其进行算术运算,例如上面的减法。移位等按位运算不考虑符号
-
转换前将
*c转换为unsigned char。您的编译器对有符号类型进行算术右移,而普通的char似乎是您机器上的有符号类型。 (*c = ((unsigned char)(*c) >> numRotate) | ((unsigned char)(*c) << (8 - numRotate));) -
@mangusta 确实与
*c已签名有关。有符号变量的右移是实现定义的。轮班前将其发送至unsigned char。 -
@AlexLop 你的意思是C标准库的实现吗?我想如果我们将 11111111(一种字节大小的数据类型)向左移动一次,无论符号是什么,我们都会得到 11111110。 OP 抱怨她得到的位模式,而不是它的数值
标签: c types binary rotation bit-manipulation