2017-01-12 18 views
1

私は、Cのstdint.hの概念に多少慣れています。整数のサイズを明示すると、ヘッダファイルは#define整数をそのマシンの適切な整数に置き換えます。たとえば、私のマシンの符号なし整数が16ビットの場合、uint32_tlong unsigned intに置き換えられます。マシンがCで標準の整数データ型をサポートしているかどうかをどのように判断しますか?

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

コンパイラがスローしてエラーが解決できないというエラーが表示されますか?または、64ビットデータ型を保持するために2つの32ビット割り当てを使用しようとしますか?

+1

算術コプロセッサなしで8ビットCPU用のCコンパイラ(レジスタは8ビットのみ)があります。そして、彼らは 'longと' float型をサポートします。想像できますか? – i486

答えて

5

特定のstdintタイプがサポートされていない場合、コードはコンパイルされません。彼らはこのようにサポートされているかどうかをチェックすることができます:あなたのコンパイラが型をサポートしていますが、あなたのCPUにはない

#include <stdint.h> 

#ifndef UINT64_MAX 
#error uint64_t not supported 
#endif 

場合、それはいくつかのコンパイラ・ライブラリのコードは黙って、より大きなタイプをエミュレートするために呼び出されますことを意味します。

たとえば、8ビットマイクロコントローラでuint32_tを使用すると、コンパイラがそれをサポートする傾向がありますが、ソフトウェアでエミュレートされるタイプなので、マシンコードが大きくなり、速度が遅くなります。

+0

興味深いことに、' #ifndef UINT64_MAX'は確かに良いですが、どの仕様によって他のコードが 'UINT64_MAX'を定義するのを妨げています。 – chux

+0

UINT64_MAXはstdint.hで定義されていますか、それともlimits.hですか? – immibis

+0

@immibis stdint.h – Lundin

2

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

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

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


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

unsigned long long ull; // must exist 

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

uint64_t u64; // may exist 
+0

マシンが何らかの理由でそれらを処理できない場合、コンパイラは64ビットまでサポートする必要はありません。 7.20.1.1 "これらの型は任意であるが、インプリメンテーションでは、幅が8,16,32、または64ビットの の整数型と2の補数表現を持つパディングビットと(符号付きの型の)整数型を提供する場合、対応するtypedef名を定義しなければなりません。たとえば、多くの8ビットMCUコンパイラではuint64_tをサポートしていません。 – Lundin

+0

私は、プロセッサが命令を分割することで任意のサイズの整数演算を行うことができることを理解していますが、私はメモリからの読み書きに興味があるとしましょう。メモリ内のint64_tへのポインタを宣言しようとすると、そのポインタを逆参照することにした場合、逆参照できますか?それとも最初の32ビット整数を逆参照するだけですか? – Izzo

+1

@Teagueコンパイラが 'int64_t'をサポートしている場合、期待どおりに動作します。一度に32ビットのデータを読み込み、エンディアンに従って結果を格納します。しかし、読みは遅く、決して原子ではありません。 – Lundin

1

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

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

stdint.hによって提供される種類のものがいくつか必要です。準拠した実装は間違いなくそれらを提供します。オプションのマクロでは、対応するマクロが定義されているかどうか(たとえばINT64_MAX)をテストすることによって、コンパイラがマクロを提供するかどうかをテストできます。

関連する問題