Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么-1>&燃气轮机;1计算为-1?_C++ - Fatal编程技术网

C++ 为什么-1>&燃气轮机;1计算为-1?

C++ 为什么-1>&燃气轮机;1计算为-1?,c++,C++,正如标题所说 我有这样一句话foo |(~-1>>1))如果foo为负数,则保持foo不变的意图,如果未设置,则设置第一位 (我所说的保持现状,是指比特) 但这对福来说没有任何改变 在dbeug之后,我计算出-1>>1的计算结果为-1。我很确定右移确实会从左边填充0,但这似乎填充了1,这可以解释为什么FF>>1会计算为FF,但这对我来说似乎也不合理 >我的错误是什么?我的错误在哪里? < P> C++标准[Exp.SHIFT ](5.5.3节)指定了 E1> E2:“如果代码> E1 < /C

正如标题所说

我有这样一句话
foo |(~-1>>1))
如果foo为负数,则保持foo不变的意图,如果未设置,则设置第一位

(我所说的保持现状,是指比特)

但这对福来说没有任何改变


在dbeug之后,我计算出
-1>>1
的计算结果为-1。我很确定右移确实会从左边填充
0
,但这似乎填充了
1
,这可以解释为什么
FF>>1
会计算为
FF
,但这对我来说似乎也不合理


>我的错误是什么?我的错误在哪里?

< P> C++标准[Exp.SHIFT ](5.5.3节)指定了<代码> E1> E2<代码>:“如果代码> E1 < /Cord>具有签名类型和负值,所得值是定义的实现。”该实现可以编译为使用符号保留移位操作。

< P> C++标准[Exp.SHIFT ](5.5.3节)指定了<代码> E1> E2<代码>:“如果代码< E1 < /代码>具有签名类型和负值,则所得值为实现定义。”实现可将其编译为使用保留符号的移位操作。

根据标准,右移位是实现定义的(5.8.3):

E1>>E2的值是E1右移位的E2位位置。如果E1具有有符号类型和负值,则结果值 是否定义了实现

例如,这提到了微软的编译器

右移位运算符使移位表达式中的位模式 按指定的位置数向右移动 加法表达式。对于无符号数字,具有 已由轮班操作空出的数据均为零填充用于签名 数字,符号位用于填充空位位置。In 换句话说,如果数字为正数,则使用0,如果数字为 为负,使用1


这似乎与您的情况相符。

根据标准,右移是实现定义的(5.8.3):

E1>>E2的值是E1右移位的E2位位置。如果E1具有有符号类型和负值,则结果值 是否定义了实现

例如,这提到了微软的编译器

右移位运算符使移位表达式中的位模式 按指定的位置数向右移动 加法表达式。对于无符号数字,具有 已由轮班操作空出的数据均为零填充用于签名 数字,符号位用于填充空位位置。In 换句话说,如果数字为正数,则使用0,如果数字为 为负,使用1


这似乎与您的情况相符。

您的编译器使用了算术右移指令,而不是标准允许的逻辑右移指令。要获得所需的行为,请强制转换为相同宽度的无符号类型,然后进行移位。

编译器使用算术右移指令,而不是标准允许的逻辑右移指令。若要获得所需的行为,请将其强制转换为相同宽度的无符号类型,然后进行移位。

负数的右位移位是特定于编译器实现的。@DavidSchwartz:但为什么
1111
>1在我使用
0
将其向右移位1时变为
1111
?为什么移位会出现,即使它与其他操作一样?“我很确定右移位会从左边填充”这是实现定义的,正如所说。“我很确定右移位会从左边填充0”-不,这是实现定义的。显然,您的实现将其定义为算术右移(而不是逻辑右移)。请参阅“算术右移和除法的不等价性”。负数的右移位是特定于编译器实现的。@DavidSchwartz:但为什么
1111
>1在我用
0
填充时会变成
1111
?为什么移位会出现,即使它与其他操作一样?“我很确定右移位会从左边填充”这是实现定义的,正如所说。“我很确定右移位会从左边填充0”-不,这是实现定义的。显然,您的实现将其定义为算术右移(而不是逻辑右移)。请看我的错误,但我不把微软的关于C/C++的东西说出来,因为他们甚至没有C或C++的编译器。他们的MSVC是一切,但不尊重这种语言的标准。但第一件事是真的。“Zaibis,你没有提到你使用的是哪一个编译器,所以我包括了我发现的第一个匹配的例子,碰巧是微软的.S.Y.但是我认为,一个被标记为C++的标签不应该与MSVC联系,因为MSVC不是C++。这就是我想从我的PoVoDo中添加的,让我错了,但是我不给微软关于C/C++的任何东西,因为他们甚至没有C或C++的编译器。他们的MSVC是一切,但不尊重这种语言的标准。但第一件事是真的。“Zaibis,你没有提到你使用的是哪一个编译器,所以我包括了我发现的第一个匹配的例子,碰巧是微软的.S.Y.但是我认为,一个被标记为C++的标签不应该与MSVC联系,因为MSVC不是C++。这就是我想从POV中添加的所有内容