C言語関係掲示板

過去ログ

No.1109 char型の符号の有無

[戻る] [ホームページ]
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:
型charとして宣言されたオブジェクトは、実行基本文字集合の任意の要素を格納するのに十分な大きさをもつ。実行基本文字集合の任意の要素をchar型のオブジェクトに格納した場合、その結果の値は非負であることを保証する。その他の文字をchar型のオブジェクトに格納した場合、その結果の値は処理系定義とするが、その型で表現可能な値の範囲に含まれなければならない。
たぶんこれではないかと…
# リードオンリーは辛い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だと完全に思い込んでおりましたが、
処理系定義だったんですね。(大抵はそれがデフォルトなんでしょうけど)
今後は頭の片隅で意識しようと思います。