
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型に型変換する。」では何故いけないのでしょうか?
宜しく願います。
No.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関数を調べてください)。
No.3
- 回答日時:
ひとつ確実にいえることは、符号付き整数型から符号無し整数型に変換する場合の振る舞いは明確に規定されていますが、逆はそうではないということです。
すなわち、符号無し整数型から符号付き整数型に変換する際、元の値が表現できなければ、処理系定義の値になるか処理系定義のシグナルが発生します。
その意味では、符号付き整数型を符号無し整数型に変換する仕様の方がずっと無難です。
この回答への補足
<符号無し整数型から符号付き整数型に変換する際、元の値が表現できなければ、>
とは、具体的にどのような場合をいうのでしょうか?
又
<処理系定義の値になるか処理系定義のシグナルが発生します。>
とは、なにをさすのでしょうか?
初心者ゆえ、はっきりとわかりません。
ご教授願います。
No.2
- 回答日時:
これは、どちらに合わせたところで不都合が出るケースがあることに変わりはなく「どちらでもよかった」類の仕様だと思います。
#符号付きに合わせた場合はUINT_MAX > INT_MAXが偽になりますよね?
が、「実装によりまちまちになっていると困る」ものでもあるので、「符号なし側に合わせる」と仕様を定めたのでしょう。
符号なしに合わせた理由は何かあるかもしれませんが、最初に書いた通りどちらでも不都合が起きることには変わりないのであまり深く突っ込んでも仕方ないと思いますよ。
#仕様ってのはそーゆーモノも含んでる訳で。
No.1
- 回答日時:
難しく書いてますが、「左に習え」って規則があります。
例えば、
int *P ;
P = (unsigned int *)U :
これは、PとUのどっちが間違いですか?
そんなことと、思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Replaceを使って文字を変換する...
-
PCのモニターをテレビに・・・・
-
ピンx3→MiniDIN+ステレオミニジ...
-
アクセス97で作ったものをア...
-
手書き入力
-
文字を変換したい
-
周波数解析
-
cgiについて?
-
std::stringからLPCWSTR型への変換
-
C++でEUC-JPをSJISに変換したい。
-
char関数/code関数の多言語化に...
-
文字コード(たぶんユニコード)
-
漢字の正字と略字変換
-
plorog計算
-
Excel 2007 VBAで実行時エラー
-
フーリエ変換
-
ふりがなをアルファベット化す...
-
Access2003 条件付きの平均に...
-
ページ内検索でひらがな・漢字...
-
Dell optiplex 7010 SSD化
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
std::stringからLPCWSTR型への変換
-
ふりがなをアルファベット化す...
-
「彡」って文字はなんという文...
-
VS 2008(VB.NET)
-
フォームのコントロールのバッ...
-
ExcelVBA実行後に時々落ちる
-
sedで日本語の置換方法について
-
COBOLによる全角・半角混...
-
Excelマクロにて30分単位の計算...
-
Symfowareでのデータ型変換につ...
-
2バイト文字をJEFからSJISに変...
-
「髙(はしごたか)」を文字コー...
-
S-JIS → JIS コード変換するには
-
%fと%gについて
-
PL/SQLでSJISの文字コードを取...
-
JIS → S-JIS コード変換するには
-
RubyでUTF8のコード値を文字に...
-
英数字を含む文字列(0-9,A-Z)...
おすすめ情報