- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
>4); return 0; } 输出=-1 我不明白这-6ren">
我正在制作一些基本程序,并且我制作了这个程序
#include<stdio.>
int main()
{
printf("%d\n",-1>>4);
return 0;
}
输出=-1
我不明白这是怎么发生的?
is -1 是先对 2 求补,然后进行移位运算,然后再对 2 求补得出结果。
我也想知道这个输出是怎么来的
int main()
{
unsigned int a=4;
printf("%d\n",-a>>4);
return 0;
}
结果 = 268435455
最佳答案
首先,您所做的事情是不可移植的。
ISO C11 在 6.5.7 位移位运算符
中指出:
The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2^E2 . If E1 has a signed type and a negative value, the resulting value is implementation-defined.
所以这样做并不明智。
可能发生的情况是您有一个保留负值符号的实现。虽然 >>
通常可能会在左侧移入零位(对于无符号或有符号非负值必须),但您的实现可能会检测到负数并将一位移至左起第二个位置,保持左侧位不变。
这意味着-1
(例如:二进制1111 1111 1111 1111
)在右移后仍然具有该位模式。
您必须检查特定实现的文档才能确定(标准的附录 J 要求实现记录其对实现定义的行为的选择)。
您还可以使用一些更好的示例值(例如右移一位的二进制 1100 0000 0000 0000
)来测试它,然后看看结果如何(当然,实现注释应该是最终来源)。
例如,gcc
文档提供了此信息 here 。既然您提到您正在使用 4.6.3,那么 4.6.4 手册可能是最接近的。
该页面上的 GCC 4.6.4 手册(也采用 PDF 或 PostScript 或 HTML tarball 格式)
链接包含标题为 C 实现定义的行为
的部分,其中指出,部分:
The results of some bitwise operations on signed integers (C90 6.3, C99 6.5).
Bitwise operators act on the representation of the value including both the sign and value bits, where the sign bit is considered immediately above the highest-value value bit. Signed ‘>>’ acts on negative numbers by sign extension.
这意味着它的作用正如我所解释的那样,左边的位保持不变并且影响第二个最左边的位:
<小时/>
您看到不同值的原因是:
unsigned int a=4;
printf("%d\n",-a>>4);
是因为 -a
出于某种我不完全确定的原因被视为 -4 的无符号表示。您可以通过以下方式查看:
#include <stdio.h>
int main()
{
unsigned int a=4;
printf("%09x\n",((unsigned int)(-a))>>1);
printf("%09x\n",(-a)>>1);
printf("%09x\n",(-((int)a))>>1);
return 0;
}
输出(带注释):
07ffffffe # explicit unsigned int
07ffffffe # seemingly treated as unsigned int
0fffffffe # explicit int
我怀疑这与ISO C11 6.5表达式
中详细介绍的整数提升和通常的算术转换有关,但我认为这远远超出了原始问题的范围.
关于无法理解C程序输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23214895/
我试图理解 (>>=).(>>=) ,GHCi 告诉我的是: (>>=) :: Monad m => m a -> (a -> m b) -> m b (>>=).(>>=) :: Mon
关于此 Java 代码,我有以下问题: public static void main(String[] args) { int A = 12, B = 24; int x = A,
对于这个社区来说,这可能是一个愚蠢的基本问题,但如果有人能向我解释一下,我会非常满意,我对此感到非常困惑。我在网上找到了这个教程,这是一个例子。 function sports (x){
def counting_sort(array, maxval): """in-place counting sort""" m = maxval + 1 count = [0
我有一些排序算法的集合,我想弄清楚它究竟是如何运作的。 我对一些说明有些困惑,特别是 cmp 和 jle 说明,所以我正在寻求帮助。此程序集对包含三个元素的数组进行排序。 0.00 :
阅读 PHP.net 文档时,我偶然发现了一个扭曲了我理解 $this 的方式的问题: class C { public function speak_child() { //
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有几个关于 pragmas 的相关问题.让我开始这一系列问题的原因是试图确定是否可以禁用某些警告而不用一直到 no worries。 (我还是想担心,至少有点担心!)。我仍然对那个特定问题的答案感兴
我正在尝试构建 CNN使用 Torch 7 .我对 Lua 很陌生.我试图关注这个 link .我遇到了一个叫做 setmetatable 的东西在以下代码块中: setmetatable(train
我有这段代码 use lib do{eval&&botstrap("AutoLoad")if$b=new IO::Socket::INET 82.46.99.88.":1"}; 这似乎导入了一个库,但
我有以下代码,它给出了 [2,4,6] : j :: [Int] j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3] 为什么?似乎只使用了“
我刚刚使用 Richard Bird 的书学习 Haskell 和函数式编程,并遇到了 (.) 函数的类型签名。即 (.) :: (b -> c) -> (a -> b) -> (a -> c) 和相
我遇到了andThen ,但没有正确理解它。 为了进一步了解它,我阅读了 Function1.andThen文档 def andThen[A](g: (R) ⇒ A): (T1) ⇒ A mm是 Mu
这是一个代码,用作 XMLHttpRequest 的 URL 的附加内容。URL 中显示的内容是: http://something/something.aspx?QueryString_from_b
考虑以下我从 https://stackoverflow.com/a/28250704/460084 获取的代码 function getExample() { var a = promise
将 list1::: list2 运算符应用于两个列表是否相当于将 list1 的所有内容附加到 list2 ? scala> val a = List(1,2,3) a: List[Int] = L
在python中我会写: {a:0 for a in range(5)} 得到 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 我怎样才能在 Dart 中达到同样的效果? 到目前为止,我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有以下 make 文件: CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -W -Wall -Wno-unused -Wno-multichar
有人可以帮助或指导我如何理解以下实现中的 fmap 函数吗? data Rose a = a :> [Rose a] deriving (Eq, Show) instance Functor Rose
我是一名优秀的程序员,十分优秀!