• ベストアンサー

2進数11111111を-1ではなく256と表示させたい

#include <windows.h> #include <math.h> CHAR inc2to16(const char *str2inc){ INT i, ans=0; //文字の長さがちょうど8かを調べる if(strlen(str2inc)!=8) return 0; //文字列が1と2で成り立っていない場合0を返す for(i=0 ; str2inc[i]!='\0' ; i++){ if(str2inc[i]!='1' && str2inc[i]!='0'){ return 0; } } //128 64 32 16 8 4 2 1 //文字列を16進数に直し、値を返す for(i=0 ; i<8 ; i++){//8回ループ if(str2inc[i]=='1'){ ans += pow(2, 7-i); } } return ans; } int main(int argc, char *argv[]){ if(argc==1) return 0; printf("%d", inc2to16(argv[1])); return 0; } 01111111 までは127と期待通りの結果が返ってくるのですが、 11111111や11111110 などになると、signed型と判断して、 printf("%d", inc2to16(argv[1]); ではマイナス表示になってしまいます。 %uにしてみても最上位1ビットが1のときは表示がとてつもなく大きくなりますし。。 解決策はありますか?

  • ggaogg
  • お礼率86% (209/243)

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

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

CHAR型というのが実際にはどんな型なのかわかりませんが、inc2to16関数の返却値型をint等にすれば多分解決すると思います。 使用されているコンパイラがC99対応であれば、"%hhu"にするのも一つの手です。 inc2to16関数の返却値を強制的にunsigned charでキャストしてもどうにかなりますが、あまりお勧めはしません。(絶対止めろというほどでもありませんが)

ggaogg
質問者

お礼

どっちの方法でもできました。 CHAR型というのはwindows.hかその中のインクルードファイルで #define CHAR char というようなかんじの、別称です。(符号なし1バイト) %hhuはできませんでした。 %hhuについて、printf関数調べてみたんですけど、これについての説明は見つけられませんでしたが、普通に使われてます。 よかったらこれも説明お願いしマス(TT

その他の回答 (3)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.4

> #define CHAR char > というようなかんじの、別称です。(符号なし1バイト) これだとcharはsignedじゃないかな。charが符号付きか符号なしかは処理系依存ですね。 > printf("%d", inc2to16(argv[1])); 手っ取り早く直すなら < printf("%d", inc2to16(argv[1])&0x000000ff); で良いのでは?

ggaogg
質問者

お礼

そうですね。調べたらchar型は既定で符号ありらしいです。 浅い知識で決め付けてました。 間違った知識が改善されました。ありがとうございます。 >printf("%d", inc2to16(argv[1])&0x000000ff); してることはわかるのですが、これでどうして正常になるのかがわからない(力不足)し、頭をかかえてしまうので、自分的には手っ取り早くないかもしれません。。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

inc2to16 が符号なしの値を返すんだったら, char ではなく unsigned int とかを返すように定義しましょう.

ggaogg
質問者

お礼

戻り値の型を、unsigned intではなく、unsigned char型にしてもうまくいきました。ありがとうございます。

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

> %hhuについて、printf関数調べてみたんですけど、これについての説明は見つけられませんでしたが、普通に使われてます。 > よかったらこれも説明お願いしマス(TT 先にも書いたように、"%hhu"はC99でなければ使えません。C99に(特にライブラリ面で)完全対応している処理系はあまりないので、質問者さんが使われているものも対応していなかったのでしょう。

ggaogg
質問者

お礼

Visual C++ Toolkit 2003は使えないみたいですね。。 C99について調べたら、1999年に定められた?ようなことが書いてあったので、もうとっくにほとんどのコンパイラはサポートしているのかと思ってしまいました。 無知ぶりに呆れず答えてくださってありがとうございました。

関連するQ&A

  • mallocがうまく動かない

    コマンドライン引数で指定された文字列を逆順に返すプログラムを作るため 下記のようなプログラムを組みました。 ところが変数strの大きさがargv[1]より大きくなってしまいます。 どうすればよいのでしょうか。 #include <stdio.h> #include <stdlib.h> char *mstrrev (char *s); int main(int argc, char *argv[]){ char *str; str = mstrrev(*(argv+1)); printf("%s",str); free(str); } char *mstrrev (char *s){ int length,i; char *str; for(length=0;*(s+length)!='\0';length++); str = (char *)malloc(sizeof(char)*length); for(i=0;i<length;i++){ str[i] = s[length-1-i]; } return str; }

  • 修正おねがいします。

    コンパイルして得られる実行ファイルを list1 として、 %list1 文字列1 文字列2 ・・・ を実行すると文字列1、文字列2、・・・を連結した一つの文字列を動的に生成した領域に格納し、それをディスプレイ上に表示するプログラムを作成しようと思います。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char *argv[]) { char s[50]; int n = 0; int count = 0; char *str; if(argc < 2) puts("連結できませんでした"); else{ for(n = 1; n < argc; n++) { str = argv[n]; for(;*str != '\0'; count++) { s[count] = *str; str++; } } } s[count] = '\0'; str = malloc(strlen(s) + 1); if(str != NULL){ strcpy(str, s); printf("%s\n", s); free(str); } } これでは実行できません。どこをどう修正すべきでしょうか? また、まったく違うのであれば正しいのを教えてください。 すいません。よろしくお願いします。

  • 探索アルゴリズム

    テキストファイルを読み込んで、該当する文字列を含む行を表示するというプログラムを作りたいのです。ファイルを読み込むことはできるのですが、該当する文字列を含む行を表示するやり方がわかりません。どなたか助けてもらえないでしょうか? 一応私が作ってみたプログラムはこんな感じになったんですけど・・・ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) {  FILE *fp;  char ch;  if( argc != 3)  {  printf(" 使用法 : <プログラム名> <ファイル名> <文字> \n");  return -1;  }  if((fp = fopen(argv[1],"r")) == NULL)  {  printf("ファイルを開くことができません\n");  return -1;  }  while(( ch = fgetc(fp)) != EOF)  if(ch == *argv[2])  {  printf("%cが見つかりました\n",ch);  break;  }  fclose(fp);  return 0; }

  • [C++]ファイル出力について

    教えてください。 コマンドプロンプトから何行か書いた文章をファイルにしたいのですが、 うまくいきません。 作ったものの結果は1行1文字で出力されて、eofでうまく 終わってくれません。 コマンドプロンプトで入力(改行)された通りにファイルに出力 できるようにしたいので、どこがおかしいのか指摘お願いします。 #include <iostream> #include <fstream> #include <stdlib.h> #include <string.h> #include <string> using namespace std; int main(int argc, char *argv[]) { char str[100]; int i; i = 0; if (argc <= 1) { cerr << "Need filename" << endl; exit (1); } ifstream ifs(argv[1], ios::in); if (ifs) { cerr << "Caution" << argv[1] << " already exists " << endl; cerr << " Specify a different filename " << endl; exit (2); } ofstream ofs(argv[1], ios::out); if (!ofs) { cerr << " Unable to write to " << argv[1] << endl; exit (3); } while(str[i] !=EOF) { cin >> str[i]; ofs << str[i] << endl; i++; } return 0; }

  • 漢字を配列に入れたいのですが

    漢字を配列に入れたいのですが、うまくいきません。 3列、60行のcsvファイルを読み込んで配列に入れようをしているのですが、1列目、2列目、3列目にある漢字をそれぞれ配列に入れようとしているのですが、出力するとうまくいかないんです。誰か教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXBUFFSIZE 256 #define MAXWORDS 15 int split(char* words[], int length, char* split_ch,char* str){ int i,j; for(i=0;i<length;i++){ if((words[i] = strtok(str,split_ch))==NULL)break; str=NULL; } return(i); } int main(int argc, char* argv[]){ if(argc !=2){ printf("入力エラー"); return(0); } FILE *fp; char *ll, *words[MAXWORDS], ch, buff[MAXBUFFSIZE]; int i,j; unsigned int data1[60], data2[60], data3[60]; if((fp =fopen(argv[1],"r"))==NULL){ printf("ファイルが開けません。\n"); } j=0; ll= fgets(buff,MAXBUFFSIZE,fp); while((ll= fgets(buff,MAXBUFFSIZE,fp)) != NULL){ split(words, MAXWORDS, ",",ll); data1[j] = words[0]; data2[j] = words[1]; data3[j] = words[2]; j++; } printf("%s\n%s\n%s\n", data1,data2,data3); }

  • 二行目の*の意味を教えてください。

    #include <stdio.h> int main(int argc, char *argv[]) { int i; for ( i = 0; i < argc; i++ ){ printf("argv[%d]=%s\n", i, argv[i]); } return argc; }  以上プログラムで、二行目の*の意味を教えてくさい。  6行目のargvには*が付いていません!?  よろしくお願いします。

  • strings

    stringsと全く同じプログラムを作りたいんですが、どうもうまくいきません。 4文字以上読み込めるファイルが続いた時に表示すればいいんですが。。 ヒントを頂けるとありがたいです。 よろしくおねがいします。 #include<stdio.h> #define maxc 256 int main(int argc,char *argv[]) { FILE *fpr; char tmp[maxc]; char c; int i,evi=1; if(argc!=2){ //もしargcの数が2じゃなければ成り立たないからエラーを出す。 printf("それじゃできませんよ。\n"); return(-1); } fpr=fopen(argv[1],"r"); if(fpr==NULL){ printf("%s がありませんね。\n",argv[1]); return(-1); } i=0; /*****************読み込める時****************/ while((c=fgetc(fpr))!=EOF){ //fprから一文字ずつ読み込む。 if(c >= 0x20 && c<=0x7e){ //読み込める文字の場合 tmp[i]=c; i++; evi=0; //証拠を残す。 } /*****************読み込めない場合*********************/ else{ //読み込めない文字の場合 \0 or \n if(evi==0){ //一文字前が読み込める時 つまり\nの時 printf("\n"); } i=0; evi=1; } if(i>=4){ printf("%s",tmp); i=0; } } fclose(fpr); return(0); }

  • 文字配列から数値への変換

    MicrosoftのVisual-Studio 2005を使っています。 C/C++については、ほぼ素人で、困っています。 下記のような簡単なソースで、 456 012 678 を表示するようにしたいのですが、できなくて困っています。 最初の 123 789 345 は下記のソースで表記できたのですが、どうすればよいの でしょう? 数値をわざと文字列で読み込んで、これを 数値に変換しているのでややこしいのかもしれませんが、 できればこれでやりたいので、申し訳ありませんが、教えていただ けないのでしょうか。よろしくお願いします。 #include "stdafx.h" #include "stdlib.h" char str[3][200] = { "123 456", "789 012", "345 678" }; int _tmain(int argc, _TCHAR* argv[]) { int a[10]; for (argc = 0; argc < 3; argc++){ a[argc] = atof(str[argc]); printf("%d\n", a[argc]); }; return 0; }

  • 文字列の扱い方

    初歩的な質問ですみません… str文字列からcという文字を見つけたら添字を返すという関数を作ったのですが、 iにこの関数を代入して、if文の制御式にiを使って比較するまでは正常なのですが、 真文にiを使うと何故か偽文(という言い方でいいのでしょうか…この場合("そんな値はありません。"というところです)が実行されてしまいます。 よろしければご教授お願い致します。 #include <stdio.h> int str_char(const char str[],int c) { int len = strlen(str); int i; for (i = 0;i < len;i++) { if (str[i] == c) return i; } return -1; } int main() { char str[64] = "Fucking Brutal Death Metal"; int ch,i; printf("どの文字を調べますか?"); scanf("%c",&ch); i = str_char(str,ch); if (i >= 0) printf("その文字は%d番目にあります。",str_char(str,ch) + 1); //何故かiだと動かない else printf("そんな値はありません。"); return 0; }

  • ソースプログラムのエラー

    自分で四則演算のプログラムを組んだのですが エラーが出てお手上げ状態です。 どこが間違っているのかどなたか教えていただけませんか?? ちなみに足し算の場合はいくつ足しても計算できるという プログラムです☆ #include<stdio.h> int main(int argc, char *argv[]){ int i,a=0,b=0,x=0; int m=0; if(argv[1]!="+"||argv[1]!="-"||argv[1]!="*"||argv[1]!="/"||){ printf("指定された文字ではありませんよ\n"); return -1; } a = atoi(argv[2]); b = atoi(argv[3]); if(argv[1]=="-"){ m=a-b; } if(argv[1]=="*"){ m=a*b; } if(argv[1]=="/"){ m=a/b; } if(argv[1]=="+"){ for(i=2;i<argc;i++){ x=atoi(argv[i]); m+=x; } printf("%d\n",m); return 0; }

専門家に質問してみよう