为什么我和& (和)__int64变量上的位?

时间:2011-08-18 09:41:34

标签: c++ 64-bit

以下是代码:

#include <iostream>

using namespace std;

template<class T>
void printbinary3(T num){
   for(int i = sizeof(T) * 8 - 1; i >= 0 ; --i) {
      if((1 << i) &  num)
         cout << "1";
      else
         cout << "0";   
   }
   cout << endl;
}

int main ()
{
   char a = 1;
   short b = 1;
   int c = 1;
   long d = 1;
   __int64 e = 1;
   unsigned __int64 f = 1;

   printbinary3(a);
   printbinary3(b);
   printbinary3(c);
   printbinary3(d);
   printbinary3(e);
   printbinary3(f);
   return 0;
}   

这是输出:

00000001
0000000000000001
00000000000000000000000000000001
00000000000000000000000000000001
0000000000000000000000000000000100000000000000000000000000000001

编译时,我得到无符号__int64变量的错误 - f。

1> : warning C4334: '<<' : result of 32-bit shift implicitly converted to 
     64 bits (was 64-bit shift intended?)
1>   xx.cpp(66) : see reference to function template instantiation 
     'void printbinary3<unsigned __int64>(T)' being compiled

为什么我没有看到

0000000000000000000000000000000000000000000000000000000000000001

作为64位整数的输出?

安格斯

2 个答案:

答案 0 :(得分:3)

printbinary3函数中:

void printbinary3(T num){
   for(int i = sizeof(T) * 8 - 1; i >= 0 ; --i) {
      if((1 << i) &  num)

在这里,您要创建一个类型为1的文字int,其中最可能是32位。如果T = __int64,您将把它移位太多位,导致溢出和警告。

而不是使用隐式int,而是明确地创建T而不是:

      if((T(1) << i) &  num)

这应该可以修复警告和输出。

答案 1 :(得分:0)

阅读警告并修复代码。

在C ++ 0x中或作为g ++当前C ++实现的扩展,64位无符号整数文字需要ull后缀:50ull。需要声明64位无符号整数unsigned long long