2

私と私の友人は、長距離で非常に奇妙な問題に遭遇しました。つまり、基本的に、私のコンピューターには 64 ビット プロセッサが搭載されていますが、32 ビット システムが搭載されています。彼は 32 ビット OS と CPU の両方を持っています。

まず、 printfed sizeof(long long). 私たち二人にとって、それは8でした。

次に、これを行いました。

long long blah = 1;

printf ("%lld\n", blah<<40);

私にとって、これは 1099511627776 を返します (これは正しい結果です)。彼にとっては0です。

そんなことがあるものか?私たちは両方とも同じ sizeofs を持っています。

前もって感謝します。

編集:コード ブロック 12.11 を使用して Win7 でコンパイルして実行しました。彼は Win XP と同じバージョンの CB を使用しています。

EDIT2: 要求されたソース コード:

#include <cstdio>

int main()
{
    long long blah = 1;

    printf ("%lld\n", blah<<40);

    return 0;
}

#include <cstdio>

int main()
{
    printf ("%d", sizeof(long long));

    return 0;
}
4

2 に答える 2

3

MSVCRT.DLLあなたとあなたの友人は、悪名高い、またはおそらく他のライブラリの異なるバージョンにリンクしていると思います。

Code::Blocks FAQ から:

Q: Code::Blocks ではないのはどれですか?

A: Code::Blocks はコンパイラでもリンカでもありません。Code::Blocks のリリース パッケージには、ターゲット プラットフォームでまだ提供されていない場合、コンパイラ スイート (MinGW/GCC) が含まれる場合があります。ただし、これは「現状のまま」提供され、Code::Blocks 開発チームによって開発/保守されていません。

したがって、「コード ブロック 12.11 を使用して Win7 でコンパイルして実行した」という記述は厳密には正しくありません。コンパイラではないものでコンパイルすることはできません。

2 人が実際に使用しているコンパイラ (上記を参照してください: 「コード ブロック」ではありません) とライブラリを調べてください。

于 2013-11-01T21:03:34.640 に答える
1

印刷システムが long long を処理できないか、シフト演算子が 32 ビットで機能しないかの 2 つの問題のいずれかである可能性があります。これを試して

#include <cstdio>
int main()
{
   union
   {
      long long one;

      // Intel based systems are back to front
      struct {
         long lo;
         long hi;
      } two;
   } xxx;

   xxx.one = 1LL;
   xxx.one = xxx.one << 40;
   printf ("%016llx %08x %08x\n", xxx.one, xxx.two.hi, xxx.two.lo);
   return 0;
}

最初の数字がすべてゼロで、他の 2 つのうちの 1 つがそうでない場合、対処できないのは printf です。すべての数値がゼロの場合、シフト演算子は 64 ビットに対して定義されていません。

于 2013-11-01T20:46:07.383 に答える