アプリ版:「スタンプのみでお礼する」機能のリリースについて

下の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

A 回答 (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であるからです。
# つまりは正確では無い,ということ。
    • good
    • 0
この回答へのお礼

助かりました

お礼日時:2011/05/09 14:56

そのアルファベットは「接尾語」と呼ばれるもので、定数の型を指定しています。


整数にUまたはuを付けると unsigned になります。
他にlongを表わす L, 実数型でfloatを表わす F等があります。


ところで、このプログラムの動作は理解できていますか?
uの有無で結果が変わるはずです。
その理由を理解できますか? (おそらく、そのための例題かと思われます)

この回答への補足

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

補足日時:2011/05/08 23:01
    • good
    • 0

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A