• ベストアンサー

c languageで 簡単な質問があります

下のcodeで 1u 2Uはなんですか? void main(void) { int a = -1; if(a < 1u) printf("True"); else printf("False"); } //結果 False void main(void) { if(3 < -2U) printf("Large : %d\n", -2U); else printf("Large : %d\n", 3); } //結果 Large : -2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

補足への回答になります。 1uと1は「型が違う」という大きな違いがあります。 内部のビット表現がどうこうではなく,「型が違う」ところにCの処理での大きな違いが出てきます。 # 個人的には内部表現なんて最初から気にするような性質の物では無いと思っています。 まず,-1と1uを比較している場合ですが, ・-1はint型,1uはunsigned int型なのでinteger conversion rankは等しい ・int型とunsigned int型の演算なので,int型はunsigned int型に変換される ・値をunsigned int型に変換するには,(UINT_MAX + 1)に相当する値を加算または減算し続けることで行われる ことが,規格 (ISO/IEC 9899:1999) で決まっています。 具体的には,6.3 Conversions - 6.3.1 Arithmetic operandsの, 6.3.1.1 Boolean, characters, and integers および 6.3.1.8 Usual arithmetic conversions になります。 さて,計算が面倒なのでUINT_MAXが65535の処理系を考えると, if (a < 1u) は, if (-1 < 1u) と等価であり,さらに, if ((unsigned int)(-1 + (UINT_MAX + 1UL)) < 1u) と等価となり,つまりは if (65535u < 1u) と等価になります。よって,ifの中は偽になり,Falseが表示されます。 次に,(3 < -2u)ですが,まず,-2uについて, ・値をunsigned int型に変換するには,(UINT_MAX + 1)に相当する値を加算または減算し続けることで行われる が適用されます。 -2uは(unsigned int)(-2 + (UINT_MAX + 1UL))に相当し,先の例では65534uになります。 次に,3はそのまま3uになります (表現できるので)。 if (3 < -2u) は if (3u < 65534u) と等価となります。このifの中は真ですから,printf("Large : %d\n", -2U);が処理されます。 ここで-2と表示されますと書かないのは,-2Uという「unsigned int」の値を%dに渡しているため, 厳密にはundefined behaviorであるからです。 # つまりは正確では無い,ということ。

yawara18
質問者

お礼

助かりました

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

そのアルファベットは「接尾語」と呼ばれるもので、定数の型を指定しています。 整数にUまたはuを付けると unsigned になります。 他にlongを表わす L, 実数型でfloatを表わす F等があります。 ところで、このプログラムの動作は理解できていますか? uの有無で結果が変わるはずです。 その理由を理解できますか? (おそらく、そのための例題かと思われます)

yawara18
質問者

補足

unsigned charは 0~256 charは -127~127までですよね 何で-1が1より小さいんですか? -1は 1111 1111 1uは 0000 0001 こんな意味ですか? でも1uと1とは同じなのになんで結果は違いますか?

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

符号なし整数(unsigned int)の頭文字です。

関連するQ&A