No.1815![]() |
キャスト 投稿者---Kuma(2004/05/24 10:21:25) |
||
void abc(int a)いう引数がintの関数に char i; 渡すとき i=-76; abc((int)i);としたら 関数側では+180になってしまいました。 どうすれば正しく-76とわたせるのか 教えてください。 |
No.1817![]() |
Re:キャスト 投稿者---ぽこ(2004/05/24 11:04:31) |
||
>char i; >渡すとき >i=-76; >abc((int)i);としたら >関数側では+180になってしまいました。 iの型は本当にcharですか? unsigned charではありませんか? |
No.1818![]() |
Re:キャスト 投稿者---ぽこ(2004/05/24 11:19:02) |
||
>関数側では+180になってしまいました。 関数側ではどのような処理で引数が180だったと判断していますか? printf()で符号なしの整数として表示させたりしてませんか? |
No.1820![]() |
Re:キャスト 投稿者---tetrapod(2004/05/24 11:24:44) |
||
単なる char 型は、実際には unsigned char と同じか signed char と同じか、どちらかです。 お使いの処理系では unsigned char と同じなのでしょう。 unsigned char i=-76; では暗黙の数値変換によって i は 180 になります。 -76 を渡したいのであれば、以下のどれかの手段でいけます。 ・char を使うのをやめて signed char を使う ・abc((unsigned char)i); と呼ぶ |
No.1828![]() |
Re:キャスト 投稿者---RAPT(2004/05/25 00:26:42) |
||
>・abc((unsigned char)i); と呼ぶ abc((signed char)i); と呼ぶ ですね。 |
No.1843![]() |
Re:キャスト 投稿者---とおり(2004/05/28 14:47:59) |
||
>単なる char 型は、実際には unsigned char と同じか signed char と同じか、どちらかです。 便乗質問、すみません。 これはC言語の規格上、どちらかでよいと規定されているのでしょうか? |
No.1844![]() |
Re:キャスト 投稿者---RiSK(2004/05/28 16:03:35) |
||
>>単なる char 型は、実際には unsigned char と同じか signed char と同じか、どちらかです。 >これはC言語の規格上、どちらかでよいと規定されているのでしょうか? JISC-日本工業標準調査会 JIS X3010:2003 6.2.5:たぶんこれではないかと… # リードオンリーは辛いPDF… |
No.1845![]() |
Re:キャスト 投稿者---tetrapod(2004/05/28 16:17:41) |
||
C99 Draft の一部を超訳 The Implementation shall define 'char' to have the same range, representation, and behavior as either 'signed char' or 'unsigned char'. 処理系は char を 'signed char' または 'unsigned char' のどちらかと 同じ値範囲、表現、振舞をするように定義しなければならない。 なので実際にどちらになるかは implementation-defined つまり 処理系作者がマニュアルに明記せよ、ということになります。 VC++ では -J オプションなしなら signed char -J ありなら unsigned char gcc なら -fsigned-char(default) -funsigned-char あたりに記述有り。 # C++ 規格書 ISO/IEC 14882:1998 はまた表現が微妙に違うが... |
No.1850![]() |
Re:キャスト 投稿者---とおり(2004/05/29 14:23:18) |
||
RiSKさん、tetrapodさん、ありがとうございました。 今まで、charはsigned charだと完全に思い込んでおりましたが、 処理系定義だったんですね。(大抵はそれがデフォルトなんでしょうけど) 今後は頭の片隅で意識しようと思います。 |