gpt4 book ai didi

C++ unix 32 位到在 x86_64 芯片(64 位服务器)上运行的 Red Hat Linux

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:05 25 4
gpt4 key购买 nike

我正在开发一个项目,将 C++ 应用程序从 32 位 unix 移植到在 x86_64 芯片(64 位服务器)上运行的 Red Hat Linux。我面临与长数据类型相关的问题。我编写了一个示例程序来打印二进制长整型和无符号长整型值 1。中间有一个额外的 1:

ul = 0000000000000000000000000000000100000000000000000000000000000001
l = 0000000000000000000000000000000100000000000000000000000000000001

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 位服务器)上的 Red Hat Linux 中获得额外的 1 中间,而不是在 unix 中,这是运行时问题的原因。有任何想法请告诉我。

最佳答案

问题在这里:

unsigned long mask = (1 << n);  

显然,unsigned long 在您的系统上有 8 个字节,而普通的 int 有 4 个字节。

这里有一个值为 1 的 int(如果没有明确指定,每个字面值都是 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

关于C++ unix 32 位到在 x86_64 芯片(64 位服务器)上运行的 Red Hat Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31401782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com