你能控制按位右移将在C中填充什么吗?

你能控制按位右移将在C中填充什么吗?,c,bitwise-operators,C,Bitwise Operators,据我所知,在C语言中使用左移位逐位运算符时,可以保证空位将被0填充。然而,我已经了解到右移取决于实现,这意味着在一些机器中,空位将被0填充,在其他机器中,它们将被1填充 我在程序中使用右移,事实上,我的机器正在用1填充空白位。问题是我需要用0来代替它 有没有办法强制在右班使用0 一种解决方案是,在应用右移之后,创建一个类似0111111的掩码,然后应用位and,这将更改插入0的最左边的1 但这样做既麻烦又浪费时间。如果有一种方法告诉我的机器在右班换1,那就容易多了 谢谢将数字转换为无符号,然后移

据我所知,在C语言中使用左移位逐位运算符时,可以保证空位将被0填充。然而,我已经了解到右移取决于实现,这意味着在一些机器中,空位将被0填充,在其他机器中,它们将被1填充

我在程序中使用右移,事实上,我的机器正在用1填充空白位。问题是我需要用0来代替它

有没有办法强制在右班使用0

一种解决方案是,在应用右移之后,创建一个类似0111111的掩码,然后应用位and,这将更改插入0的最左边的1

但这样做既麻烦又浪费时间。如果有一种方法告诉我的机器在右班换1,那就容易多了


谢谢

将数字转换为无符号,然后移位。这将强制0填充。

有两种不同的右移操作:算术和逻辑

逻辑移位用于C中的无符号数字。它总是用零填充高位。这就是你需要的

算术移位用于有符号数字,因为它保留被移位数字的符号。如果数字为正数,则最高有效位将为0,并用0填充。如果数字为负数,最高有效位将为1,因此将用1s填充

注意,在Java中,它们实际上使用不同的运算符:
>
用于算术,
>
用于逻辑。这是必需的,因为Java没有无符号类型。

不,您不能

无符号类型上的移位定义良好(只要右操作数为非负且小于左操作数的宽度),并且它们总是零填充

有符号类型上的移位(或任何按位操作)通常不是一个好主意。如果左操作数为负数,则
生成一个实现定义的结果(这意味着编译器必须记录它所做的事情,但您无法控制它)。对于有符号类型的非负值,只要不溢出(如果溢出,则行为未定义),结果就是您所期望的结果

以下是报告的内容(第6.5.7节):

对每个操作数执行整数提升。类型 结果的一部分是提升的左操作数的结果。如果 右操作数为负或大于或等于宽度 对于提升的左操作数,行为未定义

E1E2的结果是E1右移E2位位置。如果E1有 无符号类型,或者如果E1有符号类型和非负值, 结果的值是商E1/ 2E2。如果E1有符号类型和负值,则结果为 值是实现定义的


你使用的是什么平台/操作系统/编译器?@Stephen Gross,Ubuntu 11.10上的GCC。另请参阅Sweet。这正是我需要的。你知道为什么吗?非常感谢。@DanielS:对于有符号整数,可以说
>
应该保留符号,因此应该扩展符号。对于无符号整数,对其进行扩展是毫无意义的。@DanielS:我还以为你是想强迫它用1来填充呢。