C语言中对负数进行逻辑右移?

6

如何在C语言中对负数进行逻辑右移?基本上,我正在寻找Java中>>>的C等效方法。

即:

int one = -16711936 ;
        //int two = -16711936 ;
        //int three = -1;
        int r, g, b;
        System.out.println(Integer.toBinaryString(one));
         r = one << 8;
         r >>>= 24;

         g = one << 16;
         g >>>= 24;  //this always ends up being -1 in C, instead of 255

         b = one << 24;
         b >>>= 24;

3
在C语言中,右移位操作的具体实现是由编译器定义的,这意味着你不知道它是算术右移还是逻辑右移(虽然大多数情况下是算术右移)。这也就意味着,如果你需要逻辑右移的话,你需要进行一些额外的手动位操作(或者进行类型转换)。 - Damon
通常情况下,不需要这样做,因为与Java不同,你没有必要这样做。 - Bo Persson
2个回答

13

与Java不同,C语言有无符号整数类型。你应该始终使用无符号整数类型进行位操作。除非你是C语言专家,否则使用带符号整数类型将使你陷入未定义行为的可怕领域,那里会有恶魔从你的鼻子飞出来。


我知道这一点。然而,Java没有无符号类型,所以我无法展示它。 - smooth_smoothie

5
将值转换为 (unsigned int) 后再进行移位。

3
最好一开始就使用无符号类型。使用有符号类型来打包这样的值是很危险的,特别是如果程序员习惯于Java并且不了解C语言的规则。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接