2012-01-27 31 views

答えて

15

それは符号なし整数リテラル定数を定義する方法です。

2

"unsigned int"を意味しますが、基本的には、数値定数がコンパイル時に適切な型に変換されるようにキャストのように機能します。

+0

*変換されていません。すでに 'unsigned int'型です。 –

+1

はい、しかし* H2CO3 *は "それは機能します*キャストのように"、彼はそれを言っていない*キャストです! –

+0

私は、 "u"がなければ、それは整数定数のデフォルトであるので署名されることを意味します。だからtge uは、コンパイラが署名されていないとみなすことを通知するものです。私はそれがキャストではないことを知っています、それはより良い理解のための唯一のサンプルでした。 –

2

これは、定数1が符号なし整数として使用されることをコンパイラに知らせる方法です。いくつかのコンパイラでは、 'u'のような接尾辞のない数字はint型であると仮定しています。この混乱を避けるために、定数を符号なし整数として使用する場合は、「u」のような接尾辞を使用することをお勧めします。他の同様の接尾辞も存在する。たとえば、floatの場合は 'f'が使用されます。

+0

"一部のコンパイラ"ではありません。すべてのコンパイラ。 – Lundin

+0

個人的には2つのコンパイラしか使用していないので、私は一般化したくありませんでした。 – Mocha

+0

私の指摘は、Cの標準では、符号付き整数として 'u'を付けずに整数リテラルを処理するようにコンパイラを強制することです。 – Lundin

21

Cコードの1のような整数リテラルは、常にタイプintです。 intsigned intと同じものです。リテラルにuまたはU(同等)を追加して、さまざまな予期しないバグや奇妙な動作を防ぐために、unsigned intであることを保証します。そのようなバグの

一例:intは16ビットであり、この式が負の値になり、16ビットマシン上で

long x = 30000 + 30000; 

両方30000個のリテラルがintであり、そして両方のオペランドがintなので、結果はintになります。 16ビットの符号付き整数は32766までの値しか格納できないため、オーバーフローします。 xは、予想通り60000ではなく、これにより奇妙な負の値を取得します。予想通り

コード

long x = 30000u + 30000u; 

は、しかし、動作します。

+1

「この式は負の値になります」。整数オーバーフローは未定義の振る舞いであるため、井戸か悪魔があなたの鼻から飛び出します。 – ouah

+1

@ouah理論的にはそうです。現実の世界では、私が見たコンパイラはすべて同じように整数オーバーフローを処理します。とにかく、結果にかかわらずバグです。 – Lundin

+2

整数のオーバーフローが定義されていないという事実は、理論的なことだけではありません。現実の世界であっても、コンパイラは整数オーバーフローを利用して未定義の動作を行って最適化を実行します。たとえば、gccには少なくとも20のケースがあり、最適化を実行できるように整数オーバフローをラップするとはみなされません。単純な例は 'a-8 <42'のような式です。もし' a'が符号付き型 'gcc'なら' a <50'に式を減らすことができます。 – ouah

関連する問題