以下是代码:
#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位整数的输出?
安格斯
答案 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
。