3

私は ISO C 2011 規格を読み始めたばかりで、その最後の公開草案[1]であり、C 字句文法[1] [458ff.] ではすべての (リテラル) 数値定数が符号なしであることに気付きました。

これは、コンパイラが符号付き数値定数 (-5.1E10 や -1 など) を対応する unary-operator の呼び出しとして解釈することを意味しますか? 例 -1 <=> -(1) , +512 <=> +(512)

更新:私のせい、「すべての(リテラル)数値定数は符号なしです」つまり、「すべての(リテラル)数値定数は負ではない」という意味です

よろしく、トーマス

4

3 に答える 3

4

接尾辞のない 10 進整数リテラルはすべて符号付きですが、負にすることはできません。おそらく、「符号なし」とは負ではないということですが、区別することが重要だと思います-それらはunsigned intタイプではありません。

正のリテラルを取得したら、単項演算子が適用されます。これが、INT_MINしばしば次のように定義される理由です。

#define INT_MIN     (-2147483647 - 1)

signed intこのプラットフォームでは で2147483648 を表すことができないためです。

于 2013-07-27T15:23:15.030 に答える
3

はい、あなたの解釈は正しいです。すべての数値リテラルには符号が含まれていません。最終的な符号はそれに適用される単項演算子です。

リテラルの型は、リテラルの値がその型内で表現できるように選択されるため、効果的に有効な数値リテラルは常に正の値を表します。

于 2013-07-27T15:23:08.920 に答える
2

すべての (リテラル) 数値定数は符号なしです。

これは間違っています。実際には、接頭辞のない 10 進整数リテラルのみが署名されています。他の整数リテラルは、符号なしまたは符号付きです。

これは、コンパイラが符号付き数値定数 (-5.1E10 や -1 など) を対応する unary-operator の呼び出しとして解釈することを意味しますか? 例 -1 <=> -(1) , +512 <=> +(512)

符号なしリテラルに適用-すると、その結果は (通常) まだ符号なしです。例えば:

-1U         // unsigned quantity
-0xFFFFFFFF // unsigned quantity (assuming 32-bit int) 

符号付きの結果は、C 整数変換の規則に従って符号なしに変換されます。

于 2013-07-27T15:52:10.143 に答える