![](/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.