2017-11-22 12 views
0

私はそのように、「自然」タイプを定義しようとしました:なぜtypedefで自然な型を定義しようとしたのですか?

typedef unsigned int nat; 

しかし、私はNATの変数を定義した場合、その変数は、通常のint型のように振る舞う:履歴書で

nat natural_index; 
natural_index = 10; // That's what I want. 
natural_index = -10; // Still a valid option. 

、私が欲しかったです "-10はunsigned intではありません"のようなコンパイラがメッセージを表示しない理由を知るために、「自然な」型を定義するために何ができるでしょうか。

追加情報:変数natural_indexを "printf"し、値「-10」を出力しました。私は少なくとももう一つの正の数(正確には10ではない)を期待していました。

+0

診断を表示するために、コンパイラの警告レベルを上げることができます。 gccでは '-Wconversion'を使って' Warning:負の整数を暗黙的に符号なし型に変換します[-Wsign-conversion] x = -10; ' –

+1

!このメッセージは本当にここ(そしていくつかのもの)によって現れました!素晴らしいヒント!ありがとう@DavidBowling – Vytor

答えて

5

Cは、2つの異なるレベルで、実行しようとしていることをサポートしていません。

まず、Cのtypedefは、新しいタイプのものを作成しません。元のタイプの省略名を作成するだけです。とき、 "基になる型" かもしれないしたがって、

typedef unsigned int nat; 

後に宣言

nat natural_index; 

は(そして、typedefのポイントは何?それは最も有用な

unsigned int natural_index; 

から100パーセント相当ですさターゲットアーキテクチャに基づいて異なります;たとえば、標準typedef uint64_tは、tに応じてunsigned longまたはunsigned long longの省略形になる場合があります第2に、Cは、算術式が暗黙の変換を行うかどうかを変更するメカニズムを持たない

natural_index = -10; 

に代入演算子は、大きな符号なしの数に(タイプintを持つ)負の数-10変換(おそらくすなわち(UINT_MAX - 10) + 1、必ずしもそうではないが、4294967286)プロセスにおいて、及び方法はありませんそれを無効にする。

あなたのオプションは、この種のもの(例えばAda、Haskell、ML)を実際にサポートする言語で動作するか、C自身を解析し、実行するルールを強制する「linting」プログラムを書くことです例はlintおよびsparseです)。

+0

素晴らしい、@ zwol!これは非常によく説明されました!しかし、 'natural_index 'という変数を出力し、' -10'という値が出力されるので、2番目の引数にはまだ問題があります。そして、私は 'natural_index - 1'のような演算を行い、結果は' -11'です。 – Vytor

+0

私は '%u'の代わりに '%d'引数を使って印刷していました。しかし、私は 'printf'でこの変換を興味深いと感じました。 – Vytor

+0

@Vytorはい、あなたの 'printf'フォーマット指定を引数に一致させることはあなた次第です。あなたのコンパイラは、一致しなければあなたに警告するモードを持っているかもしれないし、持っていないかもしれませんが、それはCが得意にするものです。 – zwol

2

式文をセミコロンで区切るのを忘れた;。代入演算子=の評価時に大きな符号付き数に

natural_index = 10; 
natural_index = -10; 

-10。 ISO9899から

6.5.16.1p2(単純割り当て)は言う:単純な割り当て(=)で

、右オペランドの値を代入式の型に変換されます。

ストレージ・クラス指定子typedefを使用する場合、これはパーサの環境またはそれを出力構文解析ツリーにタイプunsigned intのエイリアス識別子natを追加するためにパーサに指示します。この場合、natは宣言の型に評価されるため、識別子natural_indexを持つオブジェクトを宣言すると、このオブジェクトに関連付けられた左の値の型はunsigned intになります。

+0

ありがとう@alinsoar!しかし、上記のコードは、単純なサンプルでした。実際のコードでは、セミコロン:)を忘れていませんでした。私の問題は、変数natural_indexをコンパイルして出力したときに、印刷された値が「-10」で、少なくとも負でない数値、または何らかのエラーが予想されることでした。 – Vytor

関連する問題