0

在工作中,我一直在尝试在计算机上安装新版本的 Red Hat Linux,更重要的是,运行一段自定义代码。当我进行此升级时,我注意到以下错误:

从 'void*' 转换为 'int' 失去精度

此外,我注意到基于库的一系列其他错误,这些错误强制使用 32 位地址。它们似乎是从本质上将类型转换为自定义库 32 位值的结果。

底线是这样的。我相信编译器已将 int 的默认大小从 32 位更改为 64 位。我试图弄清楚是否是这种情况,而无需编写一个简单的程序来确定整数的大小。另外,有没有办法强制大小回到 32 位,至少作为概念证明?

4

3 回答 3

2

如果你在 x86_64 盒子上,int仍然是 4 个字节。如果是 8,编译器不会告诉你

cast from 'void*' to 'int' loses precision

因为不会丢失任何精度。它告诉你的是,你试图将一个 8 字节的指针塞进一个 4 字节的 int,这显然会丢失一些信息。

还有,这只是一个旁注,写这个有多难?

#include <ostream>
#include <iostream>

#define sz(t) std::cout << sizeof(t) << '\n'
int
main(void)
{
  sz(char);
  sz(int);
  sz(long);
  sz(void*);
  return 0;
}
于 2012-07-10T16:49:22.803 回答
1

使用-m32 gcc开关。

尝试编译这个:

#include <stdio.h>
int main(){
    long z;
    printf("size is %ld\n", sizeof(z));
    return 0;
}

有了-m32你应该得到4,有了-m64你应该得到8

于 2012-07-10T16:39:41.107 回答
0

经过大量的努力,我能够弄清楚以下内容。

  1. 由于寻址空间的技巧,我之前的代码需要从内存中的指针获取 32 位自定义整数。底线是,Redhat 4 中的编译器允许这样做,但 Redhat 5 中不允许。解决方案是先将其转换为 64 位标准整数,然后再转换为 32 位,就像这样(int32)(int64)some_pointer_value。我找不到更好的解决方案,但这似乎有效。
  2. 有一些带有长案例的 switch 语句。新的编译器似乎不喜欢那样。快速重新排列代码似乎可以解决它。
  3. intptr_t 技巧效果很好。
  4. 有一些类函数被声明为class_name::function1(){...}. 我想我一定是从另一种编程语言中养成了这个习惯。class_name::不得不去,但一旦去了,代码就编译了。

一旦我完成了所有这些事情,那么代码就编译好了。此外,它在 Redhat 4 中的工作原理也是一样的。唷!

于 2012-07-17T16:22:14.663 回答