1
(-1L<1U) ? printf("A"):printf("B");    
(-1L<1UL) ? printf("C"):printf("D");    
((short int)-1<1U) ? printf("E"):printf("F");    
((short int)-1<1UL) ? printf("G"):printf("H");    

gcc コンパイラで実行した後のこのコードは、BDEH を返します....なぜそうなのか理解できません。誰かがこれについてガイドしてください。

4

1 に答える 1

6

これは、標準では「通常の算術変換」と呼ばれ、同じ演算子のオペランドとして 2 つの異なる整数型が発生するたびに適用されます。

本質的には何ですか

  • タイプの幅が異なる場合(より正確には、標準が変換ランクを呼び出すもの)、より広いタイプに変換されます
  • 両方のタイプが同じ幅である場合、本当に奇妙なアーキテクチャに加えて、それらの署名されていないものが勝ちます

どのような型の値でも符号付きから符号なしへの変換では-1、符号なし型の表現可能な最高値が常に得られます。

行 (1) の場合、結果は幅longと幅によって異なりintます。intが よりも狭い場合、longすべてのunsigned値が に収まるlongため、変換longは RHS で で停止します。結果は「A」です。それらが同じ幅である場合、変換はunsigned long両側に対して続行され、結果は "B" になります。

の特別なケースとして、 toよりも狭いすべての型を昇格させる「整数昇格short」と呼ばれる機能もあります。3 行目と 4 行目では、LHS の式が最初に に変換され、値が変更されずに保持され、次に for (3)と for (4) が に変換されます。intintintunsigned intunsigned long

それによると、私のプラットフォーム(linux、gcc)はコードで「ADFH」を正しく出力します。

結果 "BDEH" は、最初に同じ幅の と を持ち、 の範囲でlongカバーされる の範囲を持つプラットフォームで発生します。つまり、 の符号ビットを無視するだけです。そのようなプラットフォームがまだ存在することを知りませんでした。intunsignedintunsignedint

数年、私は整数型の解剖学に関するブログ記事を書きましたが、これはまだ有効なはずです。

于 2013-10-17T06:45:42.090 に答える