2012-02-07 8 views
2

C/C++では、(1U)((unsigned int)1)の間に違いがありますか?私は第2のものを好むが、第2のものが実行時にタイプキャストされる(すなわち余分なCPUサイクル)ことが懸念されるが、最初のものはコンパイル時に正しいタイプを得る。ありがとう。C/C++で型付き定数を定義する

+3

たとえ違いがあっても、コンパイル時にほぼすべてのモダンコンパイラ。 – casablanca

+0

技術的な違いはありますが、実用的なものはありません。 – Xeo

+1

私は、int(1)をunsigned int(1)に変換するためにどのような命令が使用されているかと思います。 –

答えて

0

11文字。それ以外の場合は、同等です。

1

あなたはそれが正しいと思います。 (1U)私は、コンパイラの字句解析によって「符号なし」と認識されると思われますが、(符号なしのint)1は実行時操作になります。 コメントは言うまでもなく、とにかく最適化される可能性があります。

一般的に、コンパイラを考えないでください。あなたに問題があることが明らかになったら、あなたに最も読みやすいように見せて、パフォーマンスの最適化について心配してください。 私はこれが決して実際に問題を引き起こすことはないと保証することができます。 Y.

+1

ランタイム操作である '(unsigned int)1'の可能性は、最適化されていないコンパイラを最小限に抑えたとしても、基本的にはゼロになります。 –

5

で終わる日に

*保証ボイド彼らは同じではありませんね。 1U#ifの前処理指令で有効です。 (unsigned int)1は、プリプロセッサレベルでの構文エラーです。あなたはそれを(unsigned)+1にすることができますが、それはプリプロセッサでは有効ですが、あまり知られていないルールのためにのみです。

+0

「プリプロセッサ番号」は奇妙です! ISO/IEC 9899:1999、§6.4.8_前処理数_は構文を(改行を示すパイプとして)定義しています: 'pp-number:digit | 。桁| | pp-number identifier-nondigit | | pp-number E記号| pp-number p記号| pp-number P記号| pp-number。 つまり、_pp-number_にはあらゆる種類のアルファベットを含めることができます。 '(符号なし)'は数値として定義されていないので、0に変換され、 '(0)+ 1'は整数として有効です。反対。 –

+0

署名がないほど良い点。とにかく署名レベルはどのようにPPレベルで機能しますか?すべての算術演算は最大サイズの整数型のように行われますが、符号付き/符号なしの比較の問題、巨大な値のオーバーフロー/ラッピングなどはどうでしょうか? –

+0

§6.10.1_コン​​ディショナルinclusion_、¶3:_マクロ拡張によるすべての置換と定義された単項演算が実行された後、残りのすべての識別子がpp-number に置き換えられ、各プリプロセストークンが変換されますトークンに変換する。結果として生じるトークン は、 6.6の規則に従って評価される制御定数式を構成します。ただし、符号付き整数型およびすべての符号なし整数型は、それぞれがint型の型と同じ表現 を持つかのように動作します。 'uintmax_t'は、 ヘッダ' 'に定義されています。 –

関連する問題