• ベストアンサー

charとucharの違い

charに0xffを代入すると-1 ucharに0xffを代入すると255 この違いはなんですか charは符号ありなため扱える範囲が-128~127 ucharはunsignedで0~255 というのは判りますがなぜー1になるのか・・・ よろしくお願いします

noname#50824
noname#50824

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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/fusu.htm→『負数(2の補数表現)』 http://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E4%BB%98%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE→『符号付数値表現』 http://www.ffortune.net/comp/develop/data/kazu.htm→『数の表現』 参考資料を読んだ方が詳しいです。 読んでみましょう。

noname#50824
質問者

お礼

+127の次はー128になるんですね ここを理解していなかったので混乱して頭の中がおめでたい事になっていました・・ 解答付きの練習問題まで考えてくださってどうもありがとうございました

その他の回答 (5)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

> charは符号ありなため扱える範囲が-128~127 だとすると、char型の表現範囲を超える値をchar型に変換した場合、処理系定義の値になるか、処理系定義のシグナルが発生することになります。 > charに0xffを代入すると-1 は、処理系定義の値が-1だったというだけです。2の補数云々は直接関係ありません。 これ以上具体的なことは、処理系を特定しない限り、何ともいえません。

noname#50824
質問者

補足

返信ありがとうございます 処理系定義のシグナル・・・というのが判りません

回答No.4

> でもなぜ > 11111111がー1になるのがよく判りません  11111111 +       1 ───────── 100000000 ケタあふれした(8bitを超えた)最上位を取り除くと0になります。 1を加えて0になる数はー1です。

noname#50824
質問者

お礼

1加算して0になるのはー1・・・確かに! 参考になります ありがとうございました

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

char型は少なくとも8ビット以上の精度を持つ整数型です。処理系によっては、9ビットとか16ビットとか64ビットの場合もあります。符号付きか符号無しかも処理系定義です。 ucharというのは言語規格には存在しないので、それを定義した人に聞いてください。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

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」というような考え方だったかと。

noname#50824
質問者

お礼

なるほど・・・ signedのケースはそう覚えれば判りやすいですね ありがとうございました

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

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

noname#50824
質問者

補足

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

関連するQ&A

  • string から unsigned char へ

    unsigned char* uchar_string(string* str) { int length = str->length(); const char* cchar = str->c_str(); unsigned char* uchar = new unsigned char[length+1]; for(int i=0; i=length; i++) { uchar[i] = (unsigned char)cchar[i]; } return uchar; } int main() { string str; cin >> str; unsigned char* uc; uc = uchar_string(&str); cout << uc; delete uctest; return 0; } このようにしたところ、cout << uc; が出力されず入力待ちとなり正常に動きませんでした。 原因がわからないです。原因と解決方法のご教授願います。

  • char型と言うものがまだ理解出来ません。

    まだC++を初めて間もないものですが、char型が今一理解出来ずに困っております。何方か詳しく教えて下さい。 たとえば、 unsigned char c[3] = {'A', 'B', 'C'}; unsigned char chr; chr = c[1]; とした時に、chrは204 'フ'と言うような答えとなってしまいます。素人目から見ると65 'A' と言うような答えしか予想がつきません。とにかくどういうものなのかがよく理解出来ず、参考書をみても0~255(符号無,英数字1文字),-128~127(符号有,英数字1文字)と書いてり、どのような使い方をするのかの詳細がなく困っております。詳しくご説明頂ける方よろしくお願い致します。

  • char→10進数

    PICのプラグラムをC言語で書いています。 unsigned charでxを宣言して、xには電圧をAD変換した値(8bit)が代入されます。このxの値を10進数に変換したいのですが、char型をどうすればint型に変換すればいいのか分かりません。 自分なりに作ってみましたが、うまく動作しません。ご教授よろしくお願いします。 /*抜粋*/ unsigned char x; int y,i; float n; ・・・ y=0; for(i=7;i>=0;i--){   n=(((x>>i)<<7)>>7);   if(n==1)n=pow(2,i);   y=y+(int)n; }

  • unsighed charの数値をstringに

    for(k=0;k < 6;k++) { Wireless_ID_str02[i]->Wireless_ID_str += Wireless_unit[i].wireless_id[k].ToString("X2"); } このようなブログラムを使ってWireless_unit[i].wireless_id[k] unsighed charの次の数値 Wireless_unit[i].wireless_id[0] = 1; Wireless_unit[i].wireless_id[1] = 1; Wireless_unit[i].wireless_id[2] = 1; Wireless_unit[i].wireless_id[3] = 1; Wireless_unit[i].wireless_id[4] = 1; Wireless_unit[i].wireless_id[5] = 1; これを stringの Wireless_ID_str02[i]->Wireless_ID_str この中に”111111” というように代入していきたいのですが、 実際に入ってきたのは Wireless_ID_str02[i]->Wireless_ID_str = ”test313131313131” となりました。 Wireless_ID_str02[i]->Wireless_ID_str = ”111111” という風に代入する方法はありませんでしょうか。 ”Wireless_unit”というのは Wireless_unit Wireless_unit; というので宣言しています。 struct Wireless_unit { unsigned char wireless_id[6]; unsigned char use; unsigned char tampa_sig_m1; unsigned char tampa_sig_m2; unsigned char tampa_sig_m34_set; unsigned char tampa_sig_m34_reset; unsigned char battlow_sig_m1; unsigned char battlow_sig_m2; unsigned char battlow_sig_m34_set; unsigned char battlow_sig_m34_reset; unsigned char sch_sig_m1; unsigned char sch_sig_m2; unsigned char sch_sig_m34_set; unsigned char sch_sig_m34_reset; unsigned char ch1_use; unsigned char ch1_emg_sig_m1; unsigned char ch1_emg_sig_m2; unsigned char ch1_emg_sig_m34_set; unsigned char ch1_emg_sig_m34_reset; unsigned char ch2_use; unsigned char ch2_emg_sig_m1; unsigned char ch2_emg_sig_m2; unsigned char ch2_emg_sig_m34_set; unsigned char ch2_emg_sig_m34_reset; }; また、 ”Wireless_ID_str02”は array<Wireless_unit_str^>^ Wireless_ID_str02 = gcnew array<Wireless_unit_str^>(32); このように宣言しています。 namespace HomeBank { using namespace System; using namespace System::Collections::Generic; /** * 明細データクラス */ ref class Wireless_unit_str { private: public: String^ Wireless_ID_str; //array<String^>^ Wireless_ID_str = gcnew array<String^>(32); public: Wireless_unit_str() { Wireless_ID_str = "test"; } }; }

  • VC++2010 MFC 符号付きchar型変換

    VC++2010 MFCで今アプリケーションを作成していて、質問がございます。 例 char c_buff; unsigned char uc_buff; 上記のように変数を宣言し、 c_buffには0xFD;が入ってます。 その値を uc_buffに代入したいのですがどのように行ったら代入できるか よろしくお願いします。

  • char型の扱える範囲とは?

    整数をchar型にしたいと思い int a = 250; char b[1]; sprintf(b, %d, a); と書いたのですが, char型の扱える整数の範囲である-256~255のint型の整数しか char型にこの場合変換できないということでいいでしょうか? またint型に代入できる値は,32bit以内の整数という考えでいいですか?

  • charの操作について

    お世話になります、フジと申します。 今回皆様にお聞きしたいことはchar型変数の操作についてなのですが、次のプログラムのようにchar型に代入した整数を16進数用に変換させ、最後に同じchar型の変数に代入したいと考えています。 int a,b,c; char data = 48; //dataに10進数48を代入 c = (int)data; //ここでcは48になる a = c/16;          //16進数用に変換 b = c%16; c = 10*a + b;        //ここでcは30になる このint型変数c(30)をchar型変数dataに代入するにはどうしたらいいでしょうか? char buf[5]; sprintf(buf,"%d",c); にすればchar型の配列に代入することは出来ますが、これだとcの値30がbuf[0]=3,buf[1]=0となってしまい、目的の操作が達成できません。 よい方法をしっている方がいましたら、宜しくお願い致します。

  • ORACLEでNCHAR/CHARの違い

    ORACLEでNCHAR/CHARの違いについて教えて下さい。 文字列の記述に以下の2つの書きかたがありますが、 1.NCHAR(40) 2.CHAR(40 CHAR) これらにはどのような違いがあり、どう使い分けると良いでしょうか? よろしくお願い致します。 以上

  • templateの使い方を教えて下さい。

    質問タイトルの通りです。 今、 unsigned char* AllocByteArray1d(unsigned long int n){ unsigned char *box; box = (uchar *)calloc(n, sizeof(uchar)); if(box == NULL){ puts("can't allocate memory..."); exit(1); } return box; } という関数があって、これはunsigned charの配列をとってくれる関数になってます。これをtemplateを使って、intの配列もとれるようにしたいんです。 恥ずかしながら試しに、 template <typename T> T* AllocByteArray1d(unsigned long int n){ T *box; box = (T *)calloc(n, sizeof(T)); if(box == NULL){ puts("can't allocate memory..."); exit(1); } return box; } とやってみましたがダメでした。事前にTのデータ型がわからないからだろうか、と思って template unsigned char* AllocByteArray1d(unsigned long int); を入れて実体化させてみましたが、これでもダメでした。 どこを修正すれば使えるようになるのか、C++に詳しい方に教えて頂けると幸いです。

  • 私は現在、職業訓練校にて勉強し始めた初心者です。

    私は現在、職業訓練校にて勉強し始めた初心者です。 C言語の ”char型”の使い分けが解からなく困っております。 本では char型 0~255 又は -127~127 signed char型 -127~127 unsigned char型 0~255 となっており、具体的には”char型”はどう使い分けるのか解かりません。 又、符号付と符号無し以外に存在する意味が解かりません。 どうぞ宜しく御願い致します。

専門家に質問してみよう