1

私は C の stdint.h の概念にある程度精通しています。整数のサイズを明示的に指定することにより、ヘッダー ファイルは #define 整数をそのマシンの適切な整数に置き換えます。たとえば、マシンに 16 ビットの符号なし整数がある場合、uint32_tは に置き換えられlong unsigned intます。

ただし、あなたのマシンが 32 ビット整数までしかサポートしていないとしましょう。を使用するとどうなりますint64_tか?この整数サイズがネイティブでサポートされていない場合、それを修正できる代替手段がないため、これはどのように解決されますか?

コンパイラは、解決できないと言ってエラーをスローしますか? それとも、2 つの 32 ビット割り当てを使用して 64 ビット データ型を保持しようとしますか?

4

3 に答える 3

5

特定の stdint 型がサポートされていない場合、コードはコンパイルされません。次のようにサポートされているかどうかを確認できます。

#include <stdint.h>

#ifndef UINT64_MAX
#error uint64_t not supported
#endif

コンパイラが型をサポートしているのに CPU がサポートしていない場合は、一部のコンパイラ ライブラリ コードがサイレントに呼び出されて、より大きな型をエミュレートすることを意味します。

たとえばuint32_t、8 ビットのマイクロコントローラーで使用する場合、コンパイラーはそれをサポートする傾向がありますが、型はソフトウェアによってのみエミュレートされるため、結果のマシン コードは大きくなり、遅くなります。

于 2017-01-12T15:59:18.823 に答える
2

コンピュータ (プロセッサ) は、整数型の上位ビット幅を制限しません。コンパイラは制限を課します。ハードウェアは、大きな整数型の処理の複雑さと効率に影響を与えます。十分な時間とメモリがあれば、1 ビット プラットフォームでも 64 ビット演算を実行できます。

対応する C コンパイラ (C99 以降) は、少なくとも 64 ビットまでの整数幅をサポートします。

はい、32 ビット マシンは通常、32 ビット内部オブジェクトのペアを使用して 64 ビット操作を処理します。


明確にするために。C99 コンパイラは、必要な を実装するために、少なくとも64 ビットの整数型を処理する必要がありlong longます。uint64_tプラットフォームは、64 ビット幅、パディングなし、2 の補数の整数型を実装する場合と実装する場合があります。これは非常に一般的に実装されています。

 unsigned long long ull; // must exist

 #include <stdint.h>
 uint_least64_t uleast64;  // must exist

 uint64_t u64; // may exist 
于 2017-01-12T15:56:20.147 に答える
1

特定の C 実装でstdint.h(typedefマクロではなく s として) 宣言された正確な幅の型はすべてオプションです。実装は、必要な特性を持つデータ型を実際に提供する場合にのみ、それらを宣言する必要があります。

あなたの特定の例では、問題のC実装が64ビットのパディングビットのない2の補数の整数型を提供しない場合、 type をstdint.h宣言しませんint64_t。その型を自分で宣言せずに使用すると、コンパイラはコードを拒否します。

によって提供されるタイプの他のいくつかstdint.hは必須です。適合する実装は確実にそれらを提供します。オプションのものについては、それらの制限に対応するマクロが定義されているかどうかをテストすることにより、コンパイラがそれらを提供するかどうかをテストできます (例: INT64_MAX)。

于 2017-01-12T16:04:59.540 に答える