64 位变量在 C++ 中表现异常
64-bit variable acting strangely in c++
为什么 64 位变量在真正位进入第 31 位时表现得如此奇怪?在第 32 位它返回一个非常大的值然后重置。
#include <iostream>
using namespace std;
int a[65];
int main()
{
a[0]=1;
for(int i=0;i<=63;++i)
{
for(int k=7;k>=0;--k)
{
for(int j=7;j>=0;--j)
cout<<a[k*8+j];
cout<<' ';
}
cout<<'=';
cout<<(unsigned long long)(1<<i);
cout<<'\n';
a[i]=0;
a[i+1]=1;
}
return 0;
}
(unsigned long long)(1<<i);
1
仍然是 int
here.You 将 (1<<i)
的结果转换为 unsigned long long
.
使用
cout<<((unsigned long long)1<<i);
或者干脆
cout<<(1ULL<<i);
您正在转换 (1<<i)
的结果,您应该做到:
((unsigned long long)1<<i);
或更简单:
(ull1<<i);
其中 ull
使文字 1
类型为 unsigned long long。
另外,如果您没有限制或特定要求,我会建议使用不同但更简单的代码:
#include <bitset>
#include<iostream>
int main()
{
unsigned long long a = 1;
for(int i=0;i<=63;++i)
{
std::cout << std::bitset<64> (a) << " = " << a << "\n";
a = a << 1;
}
}
为什么 64 位变量在真正位进入第 31 位时表现得如此奇怪?在第 32 位它返回一个非常大的值然后重置。
#include <iostream>
using namespace std;
int a[65];
int main()
{
a[0]=1;
for(int i=0;i<=63;++i)
{
for(int k=7;k>=0;--k)
{
for(int j=7;j>=0;--j)
cout<<a[k*8+j];
cout<<' ';
}
cout<<'=';
cout<<(unsigned long long)(1<<i);
cout<<'\n';
a[i]=0;
a[i+1]=1;
}
return 0;
}
(unsigned long long)(1<<i);
1
仍然是 int
here.You 将 (1<<i)
的结果转换为 unsigned long long
.
使用
cout<<((unsigned long long)1<<i);
或者干脆
cout<<(1ULL<<i);
您正在转换 (1<<i)
的结果,您应该做到:
((unsigned long long)1<<i);
或更简单:
(ull1<<i);
其中 ull
使文字 1
类型为 unsigned long long。
另外,如果您没有限制或特定要求,我会建议使用不同但更简单的代码:
#include <bitset>
#include<iostream>
int main()
{
unsigned long long a = 1;
for(int i=0;i<=63;++i)
{
std::cout << std::bitset<64> (a) << " = " << a << "\n";
a = a << 1;
}
}