-1

32 ビット CRC を計算する関数があります。

CRC を保持するクラスへの内部変数があります。

CRC の一貫性を検証する関数は、クラスが計算しているクラス CRC のブール値の結果を返します。

クラス内のメンバー関数は次のことを行います。

CRC を一時変数に保存し、CRC を計算してから 2 つの値を比較します。

bool X::CRCisMatching()
{
   unsigned long tmpCRC = ClassCRC;
   ClassCRC = GetNewCalculatedCRC();
   printf("comparing %08x ~ with ~ %08x!\n", tmpCRC, ClassCRC);
   return tmpCRC == ClassCRC;
}

問題は、この出力が得られることです。

comparing AB44CD2A33 ~ with ~ AB44CD2A33

%08x で意図した 8 ではなく 10 の値を取得する理由

誰かが前に同様の問題に直面しましたか??

ところで、私は32ビットマシンを使用しています

4

2 に答える 2

0

sizeof(int) は期待どおりではなくprintf()(または投稿) が間違っています。

printf("comparing %08x ~ with ~ %08x!\n", tmpCRC, ClassCRC);

OPは、これが印刷された「AB44CD2A33〜と〜AB44CD2A33の比較」を報告しています。これは、 を探しているフォーマット指定子 "%08x" が、表現するのに 4 バイト以上を必要とする値を持つ をint見つけたことを意味します。これは、anが 8 バイトintであることを示唆しています。報告された 32 ビット マシンは幅intを示唆していますが、指定していません。intさらに、8inは最小印刷幅%08xのみを指定します。

OP は aunsigned longを渡し、印刷指定子は を予期していましたunsigned。これら2つのタイプがOPのマシンで同じであると仮定すると、これは問題に影響しなかったと思われます。適切なコードでは、printf 指定子を%08lxto matching に使用していたはずunsigned longです。

OPは「AB44CD2A33」の出力を報告しました。フォーマット指定子を使用%xすると、「ab44cd2a33」の出力が期待されます。これは単なる転記ミスかもしれませんが、投稿が他の場所で間違っているか、コンパイラが準拠していない可能性があります。

OP が 32 ビット CRC に明確な 32 ビット値を使用する必要がある場合は、uint32_t印刷に type と PRIX32 を使用することをお勧めします。

#include <inttypes.h>
uint32_t tmpCRC = ClassCRC;
printf("0x%" PRIX32 "\n", tmpCRC);
于 2013-09-06T17:24:57.503 に答える
0

なぜなら、最大長ではなく、最小長が 8 である%08xことを意味するからです。また、マシンが 32 ビットか 64 ビットかによって、必ずしも. プリントアウトしてサイズを確認することをお勧めします 。longsizeof(unsigned long)

通常 (保証はされませんが)、32 ビット システムには 32 ビットunsigned int. C は次のような特定の幅の型を提供します。これは ヘッダーuint32_tを介して C++11 でも利用できます。cstdint(それを提供する基になる型があると仮定します)。

私のアドバイスは、コンパイラが十分に最新のものである場合はそのsizeof(unsigned int) == 4型を使用することです。

于 2013-08-01T02:23:52.080 に答える