uint32、int32、uint64、int64などの型がstdlibヘッダーで定義されていますか?


94

私はソースコードがuint32、uint64などのタイプを使用しているのをよく見ます。アプリケーションコードでプログラマーがそれらを定義する必要があるのか​​、それとも標準のlibヘッダーで定義されるのかと思います。

アプリケーションのソースコードでこれらの型を使用する最良の方法は何ですか?

回答:


135

C99 stdint.hはこれらを定義します。

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

そして、アーキテクチャがそれらをサポートしている場合:

  • int64_t
  • uint64_t

他にもさまざまな整数のtypedefがありstdint.hます。

C99環境がない場合は、おそらく独自のtypedefを提供し、とにかくC99のtypedefを使用する必要があります。

(すなわちなし接尾辞)は、おそらくアプリケーション固有のものです。uint32uint64_t


16
この答えは間違っています。上記のすべては、そのサイズの正確な幅タイプ(パディングなし)が実装に存在する場合にのみ使用できます。でもない場合、ただし、タイプint_leastNN_t及びuint_leastNN_tためのNN8、16、32、及び64が常に存在しなければなりません。C99は、少なくとも64ビットの整数型をlong long必要とするため、少なくとも64ビットの整数型がない実装は許可されません。
R .. GitHub ICE HELPING ICEは、

@R ..:「C99 stdint.h」ではなく「POSIX stdint.h」と言ったほうが正確でしょうか?
muが短すぎます

1
POSIX stdint.hはそれらすべてを必要とします。
R .. GitHub ICE HELPING ICEを停止する

1
@R ..、正確さのためにこの回答を編集していただけませんか?現在のコンテンツとコメントの組み合わせを解析するのに少し時間がかかりました。
merlin2011 2017

SDLはtypedef uint32_t Uint32;、include / SDL_stdinc.h(SDLユーザーの場合)にそのようなエイリアスを定義します
Et7f3XIV

10

これらの整数型はすべてで定義されています stdint.h


stdint.h実装固有ではありませんか?また、この質問この質問を
Chris Frederick

3
ファイルを見ると、コメントに「ISO C99:7.18整数型<stdint.h>」が見つかりました。stdint.hC99標準を尊重しているなら、あなたはそれを得ると思います。
フィリックス

でそれらのいずれも見つかりませんstdint.h。これは0ヒットを返します:grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t
jww

1
@jww:私の場合、そのファイルにはが含まれており#include "stdint-gcc.h"そのファイルをgrepすると定義が生成されます。
Victor Zamanian

1
@jwwええ、彼らは存在しません。_t上記の回答にリストされているように、標準であり、定義する必要があるのは、サフィックスを持つものだけです。
Victor Zamanian

2

C99を使用している場合は、を含めてくださいstdint.h。ところで、64ビットタイプは、プロセッサがサポートしていれば存在します。


この点について引用してください。
BiGYaN、

6
x86は64ビット演算をサポートしていませんが、64ビット型を持っています。
R .. GitHub STOP HELPING ICE

2
はい、そうです。32ビットx 32ビット-> 64ビット乗算、64ビット/ 32ビット-> 32ビット商&32ビット剰余除算、およびキャリー付き加算とボロー付き減算命令をサポートしています。8086が32ビット演算を実行する必要があったからといって、64ビット演算を実行できるように構築されました。
マイケル・モリス

また、あるuint128_t場合は__SIZEOF_INT128__16以上(GCCと互換)に定義されています。これはx86_64 / amd64マシンで使用できますが、プロセッサーはそれをネイティブでサポートしていません。クレイだけがそのレジスターサイズを持っています、IIRC。
jww

0

質問者は実際に(醜い)int16_t(など)ではなくint16(など)について質問しました。

標準ヘッダーはなく、Linuxの/ usr / include /フォルダーにも、「_ t」なしでそれらを定義するヘッダーはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.