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