为什么当变量上的 &(anding) 位时__int64我得到奇怪的结果?

Why do I get strange result when & (anding) bits on __int64 variable?

本文关键字:int64 结果 位时 变量 anding 为什么      更新时间:2023-10-16

代码如下:

#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;
}   

输出如下:

<>之前00000001000000000000000100000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000001之前

当编译时,我得到unsigned __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位整数的输出?

安格斯

在您的printbinary3函数中:

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

在这里,您正在创建类型为int的文字1,它很可能是32位的。如果是T = __int64,你会把它移动太多位,导致溢出和警告。

不使用隐式int,而是显式创建T:

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

阅读警告并修复代码。

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