dポイントプレゼントキャンペーン実施中!

charに0xffを代入すると-1
ucharに0xffを代入すると255

この違いはなんですか

charは符号ありなため扱える範囲が-128~127
ucharはunsignedで0~255

というのは判りますがなぜー1になるのか・・・

よろしくお願いします

A 回答 (6件)

★負の表現について(8Bit)


・符号付きの char の場合
 0x00…+0
 0x01…+1
  :
 0x7E…+126
 0x7F…+127
 0x80…-128 ←最上位ビットがON(符号ビット)
 0x81…-127
  :
 0xFE…-2
 0xFF…-1
・符号なしの unsigned char の場合
 0x00…0
 0x01…1
  :
 0x7E…126
 0x7F…127
 0x80…128 ←最上位ビットがON(符号なしだから負にならない)
 0x81…129
  :
 0xFF…255
・2の補数の 0xFF(11111111) を符号付きの8ビットと解釈する。
 (1)11111111→00000000(ビット反転)
 (2)00000000→00000001(+1加算)
 (3)00000001→1なので-1と解釈
・2の補数の 0xFE(11111110) を符号付きの8ビットと解釈する。
 (1)11111110→00000001(ビット反転)
 (2)00000001→00000010(+1加算)
 (3)00000010→2なので-2と解釈
・2の補数の 0xF5(11110101) を符号付きの8ビットと解釈する。
 (1)11110101→00001010(ビット反転)
 (2)00001010→00001011(+1加算)
 (3)00001011→11なので-11と解釈
・2の補数の 0xCA(11001010) を符号付きの8ビットと解釈する。
 (1)11001010→00110101(ビット反転)
 (2)00110101→00110110(+1加算)
 (3)00110110→54なので-54と解釈
 とこんな感じで解釈します。

参考資料:
http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text …→『負数(2の補数表現)』
http://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7% …→『符号付数値表現』
http://www.ffortune.net/comp/develop/data/kazu.htm→『数の表現』

参考資料を読んだ方が詳しいです。
読んでみましょう。
    • good
    • 0
この回答へのお礼

+127の次はー128になるんですね
ここを理解していなかったので混乱して頭の中がおめでたい事になっていました・・

解答付きの練習問題まで考えてくださってどうもありがとうございました

お礼日時:2008/02/12 00:19

> charは符号ありなため扱える範囲が-128~127



だとすると、char型の表現範囲を超える値をchar型に変換した場合、処理系定義の値になるか、処理系定義のシグナルが発生することになります。

> charに0xffを代入すると-1

は、処理系定義の値が-1だったというだけです。2の補数云々は直接関係ありません。
これ以上具体的なことは、処理系を特定しない限り、何ともいえません。

この回答への補足

返信ありがとうございます

処理系定義のシグナル・・・というのが判りません

補足日時:2008/02/12 00:06
    • good
    • 0

> でもなぜ


> 11111111がー1になるのがよく判りません

 11111111
+       1
─────────
100000000

ケタあふれした(8bitを超えた)最上位を取り除くと0になります。
1を加えて0になる数はー1です。
    • good
    • 0
この回答へのお礼

1加算して0になるのはー1・・・確かに!

参考になります ありがとうございました

お礼日時:2008/02/12 00:03

char型は少なくとも8ビット以上の精度を持つ整数型です。

処理系によっては、9ビットとか16ビットとか64ビットの場合もあります。符号付きか符号無しかも処理系定義です。

ucharというのは言語規格には存在しないので、それを定義した人に聞いてください。
    • good
    • 0

F ■ F <= 16


128 64 32 16 ■ 8 4 2 1 <= 10 unsigned
-128 64 32 16 ■ 8 4 2 1 <= 10 signed
1 1 1 1 ■ 1 1 1 1 <= bit
「-128 + 127 = -1」というような考え方だったかと。
    • good
    • 0
この回答へのお礼

なるほど・・・
signedのケースはそう覚えれば判りやすいですね

ありがとうございました

お礼日時:2008/02/12 00:01

先頭ビットが符号になっていてビットが立っているとマイナスだからです。

2の補数です。

この回答への補足

解答ありがとうございます

先頭ビットが立っているとマイナスなのは判ります
2の補数=1の補数+1なのも判ります
でもなぜ
11111111がー1になるのがよく判りません

すいません・・

補足日時:2008/02/11 19:10
    • good
    • 1

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