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

if(-10<1u)の条件判定はunsigned型で評価され偽となります。
int型 unsigned int型とも32ビットで考えたとき、
1u = 0x00000001 -10 = 0xfffffff6で10進法では4294967286になります。
条件判定をunsigned型で考えれば確かに-10<1uは偽になり
int型で考えれば-10<1uは真になります。
「通常の算術変換」によれば、「一方のオペランドがunsigned int型をもつ時、他のオペランドをunsigned int型に型変換するとあります。」
よって、if(-10<1u)の条件判定はunsigned型で評価され偽となりますが、
「一方のオペランドがint型をもつ時、他のオペランドをint型に型変換する。」では何故いけないのでしょうか?
宜しく願います。

A 回答 (4件)

> <符号無し整数型から符号付き整数型に変換する際、元の値が表現できなければ、>


> とは、具体的にどのような場合をいうのでしょうか?

例えば、

unsigned int a = UINT_MAX;
int b = (int)a;

とした場合、aの値はUINT_MAXであり、int型の表現範囲に収まりません。
具体的には、int型が32ビットで負値を2の補数で表現する処理系であれば、int型の表現範囲は-2147483648~+2147483647になりますから、UINT_MAXの値(4294967295)を表現することができません。

> <処理系定義の値になるか処理系定義のシグナルが発生します。>

int型の負値の表現方法は、2の補数以外に、1の補数や符号ビット+絶対値が考えられます。これらの場合にUINT_MAXをint型にキャストするとどんな値になるか考えてみてください。
処理系定義のシグナルというのは、例えばオーバーフロー例外(プロセッサがハード的に発生させる割り込みのようなものと考えてください)が発生して、結果として何らかのシグナルハンドラが呼び出されるかもしれないことを意味しています(シグナルハンドラについてはsignal関数を調べてください)。
    • good
    • 0
この回答へのお礼

大変詳細なご説明有難うございました。やっと理解する事ができました。
今後ともよろしく願います。

お礼日時:2008/10/15 06:43

ひとつ確実にいえることは、符号付き整数型から符号無し整数型に変換する場合の振る舞いは明確に規定されていますが、逆はそうではないということです。


すなわち、符号無し整数型から符号付き整数型に変換する際、元の値が表現できなければ、処理系定義の値になるか処理系定義のシグナルが発生します。
その意味では、符号付き整数型を符号無し整数型に変換する仕様の方がずっと無難です。

この回答への補足

<符号無し整数型から符号付き整数型に変換する際、元の値が表現できなければ、>
とは、具体的にどのような場合をいうのでしょうか?

<処理系定義の値になるか処理系定義のシグナルが発生します。>
とは、なにをさすのでしょうか?
初心者ゆえ、はっきりとわかりません。
ご教授願います。

補足日時:2008/10/14 16:11
    • good
    • 0

これは、どちらに合わせたところで不都合が出るケースがあることに変わりはなく「どちらでもよかった」類の仕様だと思います。


#符号付きに合わせた場合はUINT_MAX > INT_MAXが偽になりますよね?

が、「実装によりまちまちになっていると困る」ものでもあるので、「符号なし側に合わせる」と仕様を定めたのでしょう。
符号なしに合わせた理由は何かあるかもしれませんが、最初に書いた通りどちらでも不都合が起きることには変わりないのであまり深く突っ込んでも仕方ないと思いますよ。
#仕様ってのはそーゆーモノも含んでる訳で。
    • good
    • 0

難しく書いてますが、「左に習え」って規則があります。


例えば、
int *P ;
P = (unsigned int *)U :

これは、PとUのどっちが間違いですか?
そんなことと、思います。
    • good
    • 0

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