c - 逻辑算术移位

标签 c bit-manipulation bit-shift

想澄清一些事情。

据我了解,关于算术、逻辑位移:

  1. <<两者的工作相同
  2. >>移位的不同之处在于逻辑移位将始终用 0 填充字节,而算术移位将用符号位填充它。

我如何使用 C 区分它?

据我了解,实际运算符(operator)是相同的<< , >>

命令之间有何不同:

int i=1;
printf ("%d\n", i >> 1); // logical shift

int j=1;
printf ("%d\n", j >> 1); // arithmetical shift

请告诉我,

最佳答案

在非负数的情况下,两种右移是相同的。仅当要移动的数字为负数时才会出现差异。

实际上C标准并没有规定>>在数字为负数的时候应该进行逻辑移位还是算术移位,但是通常情况下,它会进行算术移位。要执行逻辑移位,必须将数字转换为相应的无符号类型,for example :

int x = -2;
int y = x >> 1;    // arithmetic shift.
assert (y == -1);
int z = (unsigned)x >> 1;  // logical shift.
assert (z == 0x7FFFFFFF);

关于c - 逻辑算术移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3703000/

相关文章:

c - 从C中的链表中删除第一个元素

c - C , DOS 中的串行编程

c - c程序在arm平台编译时报错

matlab - 如何正确地进行按位运算?

python - 如何在python中将位数组转换为整数

c - 解释按位运算符和掩码的直观方法是什么?另外, mask 是做什么用的?

php - 为什么 '<<' 运算符有时在 Javascript 和 PHP 中的行为不同?

c - 将要存储在 int 中的左移 short 是 UNDEFINED 吗?

具有 2 个在 C 和 C++ 中声明和定义的 native 方法的 Java 程序

c++ - 两个字节合二为一