Почему я получаю странный результат, когда & (anding) бит в переменной __int64? - PullRequest
0 голосов
/ 18 августа 2011

Вот код:

#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-битного целого числа?

Angus

Ответы [ 2 ]

3 голосов
/ 18 августа 2011

В вашей функции 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)

Это должно исправить предупреждение и вывод.

0 голосов
/ 18 августа 2011

Прочтите предупреждения и исправьте код.

В C ++ 0x или в качестве расширения в текущей реализации C ++ для g ++ 64-битные целочисленные литералы без знака требуют постфикс ull: 50ull.Необходимо объявить 64-битное целое число без знака unsigned long long.

...