Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++ 关于C++;二进制的 #包括 使用名称空间std; int main() { 对于(int i=63;i>=0;--i) { cout_C++ - Fatal编程技术网

C++ 关于C++;二进制的 #包括 使用名称空间std; int main() { 对于(int i=63;i>=0;--i) { cout

C++ 关于C++;二进制的 #包括 使用名称空间std; int main() { 对于(int i=63;i>=0;--i) { cout,c++,C++,好吧,很难说出您实际期望的是什么,但是在编译器中运行它会生成许多有用的警告。如果您到处添加长整型文字符号,如: #include <iostream> using namespace std; int main() { for(int i=63;i>=0;--i) { cout<<(((1<<63)+1)&(/*(long long)*/1<<i)?"1":"0"); } retu

好吧,很难说出您实际期望的是什么,但是在编译器中运行它会生成许多有用的警告。如果您到处添加长整型文字符号,如:

#include <iostream>

using namespace std;

int main()
{
    for(int i=63;i>=0;--i)
    {
        cout<<(((1<<63)+1)&(/*(long long)*/1<<i)?"1":"0");
    }

    return 0;
}
这就是我希望你的循环做的。我不知道你希望
num
做什么,因为你没有使用这个值,但是嘿!我也装饰了它

这回答了你的问题吗?

试试这个:

1000000000000000000000000000000000000000000000000000000000000001

可能是文字是无符号的,两步数字转换(符号更改、大小更改)在某个地方搞砸了?我习惯性地拒绝阅读没有注释的代码。没有空格的代码更是如此。除了循环体的邪恶部分之外,那不应该是
0x7fffff0000000ll
(即长文本)而不是
(长文本)0x7fffffff0000000
(即,可能溢出的int-literal强制转换为long-long)?你的循环甚至没有触及
num
,你期待什么?此外,我的编译器给出了一些有用的警告。你的选民们都在辱骂。如果你不想或不能理解这个问题,请继续或添加一条简单的评论。对我来说,这个问题很明显,网站上充斥着很多自以为是的人,他们都是你宁愿卑鄙、辱骂也不愿帮助别人(a-1应该足以让这个家伙澄清他的问题)。让这个家伙休息一下,然后回答问题。
1LL@KerrekSB:它的工作方式与无符号长x=-1的工作方式相同;当你将所有位都传递到末尾时,问题就会出现(ie@KerrekSB:这是一个合理的观点。我已经更新了代码列表以反映这一点。在以这种方式处理整型文字时,我经常有点懒于指定无符号,因为它通常不会导致任何问题。@LokiAstari:将有符号整数转换为无符号整数定义得很好。但是,溢出有符号整数不是,据我所知。thx,但这不是我想要的。我知道正确的方法,我真正想要的是结果是如何产生的,以及当“面具”出现时会发生什么溢出?@ CODEDUNN:在你的问题中你还没有陈述。这就是为什么它累积了很多的下注:即使在你添加了一个提示,你正在寻找一个特定的bug并想知道“溢出”,你的问题仍然被列为“关于C++二进制的东西”,并且你想知道为什么注释<代码>。(long long)
cast会改变结果。对此,您可能会得到一个简单的一行答案。
1000000000000000000000000000000000000000000000000000000000000001
#include <iostream>

int main()
{
    long long num=0x7fffffff00000000ll >> 32; 
                                //  ^^    
                                // Literals are by default int
                                // need to add ll to let the compiler
                                // know it is long long
    for(int i=63; i>=0 ;--i)
    {   
        long long mask = (1ll << i); 
                       //  ^^    Note here I want this to be a long long
                       //        before I start shifting it.
        std::cout << ((num & mask)?1:0);
    }   
    std::cout << "\n";

    return 0;
}

./a.out
0000000000000000000000000000000001111111111111111111111111111111
cout<<(((1<<63)+1)&(/*(long long)*/1<<i)?"1":"0");
int val = (1<<63)+1;
// since these are all integer literals (and I am guessing your platform is 32 bit)
0x00000001  or 000000000000000000000000000000001
/*(long long)*/1<<i
10000000000000000000000000000000100000000000000000000000000000001
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    Mask bit wrapped around
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The mask on 0x00000001