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バイトの整数に詰め込もうとすると、明らかに少しの情報が失われることになります。

また、これは単なる補足ですが、これを書くのはどれほど難しいでしょうか?

#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 に答える