トップページ⇒tech
19コメント4KB

Cで左辺のキャストで質問

■ このスレッドは過去ログ倉庫に格納されています
0001厨房エログラマ NGNG
unsigned long a = 0xcccccccc;
(unsigned char)a = 0xff;
このようなコードをみました。
VC++で試したところ、拡張子CPPではエラーになりましたが、
拡張子Cでは問題なく通り、aの値は 0xccccccff になりました。
この代入はC言語の規則上では正しいのでしょうか?
0002名無しさん@お腹いっぱい。 NGNG
正しくない。
0003名無しさん@お腹いっぱい。 NGNG
CPUのエンディアンによって結果が変わっちゃうだろ。
0004名無しさん@お腹いっぱい。 NGNG
*((unsigned char*)&a) = 0xff;
こう書くのが正しい。
0005名無しさん@お腹いっぱい。 NGNG
あと union つかったり
0006名無しさん@お腹いっぱい。 NGNG
unsigned long a の下位の8ビットをすべて1にしたいなら
a |= (unsigned long)0xff
ですかね。
0007名無しさん@お腹いっぱい。 NGNG
>>6
キャストする必要ないだろ??
0008ビル・ジョブス NGNG
>1
C言語仕様からみれば正しい。
しかし、特別な理由が無い限りやってはいけない記述である。
特別なケースとしては処理系依存する話だが、構造体のメンバ
の順序が決まっていて、一部のメンバにアライメント境界が
必要な場合くらいだ。それも、unionで対応できるケド...
後はC言語の精神に反するがあえて処理系依存したい場合だな。
0009>8 NGNG
そんな言語仕様あったか〜?
言語仕様というからにはANSI、百歩譲ってK&Rだよな
0010>8 NGNG
ANSIでは(unsigned char)aは左辺値じゃないから代入文の左辺に
は置けない。これはANSIでは「処理系依存」ではない。

この記述ができるコンパイラはANSIに従っていない。このため
VC6も-ZaでこのMS拡張仕様を無効にする手段を用意している。

gccではコンパイルできるが結果は0xccccccffでなく
0x000000ffになる。同様に-ansi -pedanticをつけて厳格に
ANSIに準拠させるとエラーとなる。

言語仕様を(暗記せよとはいわないが)調べるぐらいしたら
001110>1 NGNG
どうでもよいが2chはいつからうち専属の質問箱に
なったんだ???
0012名無しさん@お腹いっぱい。 NGNG
うちってなんですか。笑い。
001310 NGNG
よく分からんが、できれば勝手に10>1と書かないで欲しいのだが。。
0014厨房エログラマ NGNG
いろいろ意見ありがとうございます。
>11
かなーり前からです。
2chのみなさんありがとう。
001510 NGNG
ついでにいえば、
char* p;
*((long*)p)++ = 0;
も(long*)pは左辺値でないので、厳密にはエラー。
*(long*)p = 0;
(long*)p = (long*)p + 1;
と置き換えてみると、それが顕著になる。
(char)a = 0xff;
ほどエキセントリックではないが、逆に言語仕様と思っている人が
多くて始末が悪い。。
0016名無しさん@お腹いっぱい。 NGNG
っつーかCPUがリトルエンディアンかビックエンディアンかで完璧に動作が違うんだから使っちゃいかんよね。
0017>16 NGNG
共用体も使っちゃダメと同義ではないか?
0018>17 NGNG
同義じゃないよ。
共用体はさまざまな型を内包可能な型を作る場合にも使われる。
ちゅうかそっちが主な目的だろ。
0019名無しさん@お腹いっぱい。 NGNG
>>11
>>14
なんかやつらの会社の事情を垣間見るようだ。藁)
■ このスレッドは過去ログ倉庫に格納されています