![](/img/trans.png)
[英]C/C++ intrinsics for non-temporal loads of 32- and 64-bit values on x86_64?
[英]C++ unix 32bit to Red Hat Linux running on an x86_64 chip (64-bit server)
我正在一个项目中,该项目将C ++中的应用程序从32位Unix移植到在x86_64芯片(64位服务器)上运行的Red Hat Linux。 我遇到了与长数据类型有关的问题。我编写了一个示例程序来打印二进制long和无符号long值1。中间有一个额外的1:
ul = 0000000000000000000000000000000000000100000000000000000000000000000001
l = 0000000000000000000000000000000000000100000000000000000000000000000000000001
string binary(unsigned long i)
{
int n = sizeof(unsigned long);
string s;
n *= 8;
--n;
while (n >= 0)
{
unsigned long mask = (1 << n);
s += (mask & i ? "1" : "0");
--n;
}
return s;
}
string binary(long i)
{
int n = sizeof( long);
string s;
n *= 8;
--n;
while (n >= 0)
{
long mask = (1 << n);
s += (mask & i ? "1" : "0");
--n;
}
return s;
}
int main()
{
unsigned long ul = 1;
long l = 1;
cout << "sizeof ul = " << sizeof ul << ", ul = " <<ul<< endl;
cout << "sizeof l = " << sizeof l << ", l = " << l << endl;
cout << "ul = " << binary(ul) << endl;
cout << "l = " << binary(l) << endl;
return 0;
}
大家都知道,我不明白为什么要多加1英寸中间价。 这在我的应用程序中导致运行时问题。 请告诉我。 我在x86_64芯片(64位服务器)上而不是在unix上运行的Red Hat Linux中得到了额外的1分,这是运行时问题的原因。 有什么想法请告诉我。
问题在这里:
unsigned long mask = (1 << n);
显然,在您的系统上, unsigned long
有8个字节,而普通int
有4个字节。
这里有一个int
值为1(每字面值为int
如果没有其他明确地规定)。 您正在对此4字节int
进行移位, 然后将结果转换为8字节以将其保存在mask
。 在4字节中移出超过31位是太多了,但是直到63位为止。
要解决该问题,您必须告诉编译器1
表示8字节unsigned long
。
三种可能性:
unsigned long mask = (1UL << n);
//or
unsigned long mask = ((unsigned long)1 << n);
//or just
unsigned long mask = 1;
mask = mask << n;
另一个函数(用于带符号的类型)具有相同的问题。
对于第一个变体,在那里只使用L
,而没有U
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.