プログラムの打ち方でわからないところがあります

このQ&Aのポイント
  • マイクロソフトビジュアルスタジオで実行結果が実数:1234、16進数:ffff、8進数:17777、a=1234、b=-1、c=-1と表示させるプログラムを作成したが、bとcが65535と表示されてしまう。どこが間違っているのか教えていただけないでしょうか?
  • プログラムの動作確認中に問題が発生しています。マイクロソフトビジュアルスタジオで実数:1234、16進数:ffff、8進数:17777、a=1234、b=-1、c=-1と表示させるプログラムを作成したが、bとcが65535と表示されてしまう。どこが間違っているのか教えていただけますか?
  • マイクロソフトビジュアルスタジオで実行結果が実数:1234、16進数:ffff、8進数:17777、a=1234、b=-1、c=-1と表示されるプログラムを作成したが、bとcが65535と表示されてしまいます。どこが問題なのか教えてください。
回答を見る
  • ベストアンサー

プログラムの打ち方でわからないところがあります

マイクロソフトビジュアルスタジオで  実行結果が 実数:1234 16進数:ffff 8進数:17777 a=1234 b=-1 c=-1と表示させる プログラムを作ろうと思ったのですが #include<stdio.h> void main(void) { int a,b,c; printf("整数:"); scanf("%d" , & a); printf("16進数:"); scanf("%x", &b); printf("8進数:"); scanf("%o", & c); printf("a=%d b=%d c=%d",a,b,c); } このように打つと、 b、c共に65535と表示されてしまいます・・・ どこが間違ってるのか教えていただけないでしょうか? ffff=10進数でマイナスなどの意味は分かるのですが

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

> ffff=10進数でマイナスなどの意味は分かるのですが 間違いはここです。理解が不十分です。 負の整数を表現するのに、「(2進法での)2の補数」と呼ばれる表現方法がよく使われています。 http://ja.wikipedia.org/wiki/%E8%A3%9C%E6%95%B0 http://ja.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0 0xffffが-1を表わすのは、16ビット符号付き整数のときです。 17bit以上の整数ならば、正の整数(10進の)65535です。 また、16ビットでも「符号無し(unsigned)」なら正の整数65535になります。 intは「実行環境で自然に扱えるビット幅」になっているケースが多いです。 最近一般人が触れるようなコンピュータは32bitが多いですから、intが32bitになっているケースが多いです。 32bitなら、0xffffは65535であり、表示の通りです。 実際に何ビットかは、intが扱える数値の範囲を調べればわかります。 limit.hをincludeして定数INT_MAXが(signed)intの最大値です。

その他の回答 (7)

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

unsigned short で受けたければ %hx でどうぞ>#2.

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.7

…質問ちゃんと見ていなかった… printf()のフォーマットの問題じゃないし。 とりあえず、0xffffが-1とは限らないのは既に回答されているとおりです。 デフォルトで16ビット環境になるVCって…いつのなんでしょうかね?

littbus
質問者

お礼

即回答いただきありがとうございました おっしゃる通りあいまいな知識でやってるからわからなくなるのですね・・・ もう少し勉強してがんばります

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.6

コンパイラにLSI-C 試食版を使うと 期待通りの結果にならないかな。

littbus
質問者

お礼

ありがとうございました

noname#208507
noname#208507
回答No.5

プログラムは間違っていません。入力と環境が合っていないのです。 32ビット環境なら  実数:12345678  16進数:FFFFFFFF  8進数:37777777777 と入力してみましょう。 たぶんプログラミングの参考にされている資料が、MS-DOSのような16ビットCPU時代のものなのではないでしょうか?

littbus
質問者

お礼

なるほど 学校の教科書に書いてあったのを自宅で打ってみたのですが そういうことだったんですね

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

sizeof(int)=2じゃないから。

littbus
質問者

お礼

ありがとうございました

  • unacyo
  • ベストアンサー率51% (35/68)
回答No.2

32ビット環境ならば、int型は32ビットですから、ffffffffと入れれば-1になりますよ。 変数定義のintをshortにすれば、お望みの結果になるかと。 ※私はscanfをつかわないので分からないですが、scanfの%xの受け取りにshort渡してOKでしたっけ?

littbus
質問者

お礼

うまく行きました!ありがとうございます

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>b、c共に65535と表示されてしまいます・・・ 正しい動作ですよね? printf()関数は「指定された書式」で表示していますよ。 >printf("a=%d b=%d c=%d",a,b,c); aもbもcも…10しか数文字列で出力しろ。 と指示していますよね? "%d"で。 >ffff=10進数でマイナスなどの意味は分かるのですが 型によるので正しい理解でもないような……

関連するQ&A

  • このプログラムみてもらえますか?

    課題は標準入力から正整数aを読み込み、aが素数であるか否か判定するプログラムを作れ、です。 #include <stdio.h> int main(void) { int a,b,c; for(;;){ printf("正整数を入力して下さい。\n"); scanf("%d",&a); c=a%b; for(b=2;b=a-1;b=b+1){ if(c==0) printf("素数でない。\n"); break; } printf("素数です。\n"); break; return(0); } } コンパイルはできますが、実行すると9が「素数です」と表示されます^^; よろしくおねがいします。

  • またプログラムの修正おねがいします。

    キーボードから出力した3つの整数について、以下の判定を行い 判定結果を出力するプログラムを作成する。 全部同じ 2つ同じ バラバラ * 論理演算子を使わないこと。 * インデントを正しくつけること。 #include<stdio.h> void main(void) { int a,b,c; printf("a --->"); scanf("%d",$a); printf("b --->"); scanf("%d",$b); printf("c --->"); scanf("%d",$c); if(a==b){ if(b==c){ printf("全部同じ\n"); } } else if(a!=b){ if(b==c){ printf("2つ同じ"); } else if(a==c){ printf("2つ同じ"); } else{ printf("バラバラ"); } } } 最近c言語を習ったばっかりなのでわからないとこだらけです。よろしくお願いします。

  • c言語のプログラムで

    c言語で 2つの整数を読み込んで小さいほうの数以上で大きいほうの数以下の整数をすべて加えた値を表示するプログラム で最後の表示の仕方がわかりません。 実行結果は 整数1:37 整数2:28 28以上37以下の全整数は325です。と表示されるはずです。 この表示の3行目の28と37の表示がどうやればよいのかわかりません。 #include <stdio.h> int main(void) { int a, b; int sum=0; printf("整数1:"); scanf("%d",&a); printf("整数2:"); scanf("%d",&b); if(a>b) do{ sum=sum+b; b=b+1; }while(b<=a); else do{ sum=sum+a; a=a+1; }while(a<=b); printf("%d以上%d以下の全整数の和は%dです。",a,b,sum); return(0); } 全整数の表示はできます。 do文の中でa=cとかにしてやってみましたが、うまくいきませんでした。 お願いします。

  • プログラムが上手く動作しません。

    質問です。 1.整数を1個入力し、その数を3で割った余りが0ならば"Good morning"、1ならば"Good evening"、2ならば"Good afternoon"と出力するプログラムを作成せよ。ただしswhitc文を用いること。 という問題で私は #include <stdio.h> main() {      int a;      printf("整数a:");      scanf("%d",&a);      switch(a%3)      {      case '0':           printf("Good morning \n");           break;      case '1':           printf("Good evening \n");           break;      case '2':           printf("Good afternoon \n");           break;      } } と考えましたが実行しても入力はできますがprintfが表示されません。 どこが間違っているのでしょうか?ちゃんとコンパイルはできるのですが・・・。 2.10個の整数値をキー入力し、合計と平均値を計算してその結果を表示するプログラムを書きなさい。 #include <stdio.h> main() {      int a[11],b,c,i;      for(i=1;i<11;i++)      {           printf("整数%d:\n",i);           scanf("%d",&a[i]);      }      for(i=1;i<11;i++)           b+=a[i];      c=b/10;      printf("合計値は%d",b);      printf("平均値は%d",c); } というプログラムを考えましたが、計算結果がめちゃくちゃになってしまいます。 これもどこを直したらいいべきでしょうか?

  • Cのプログラミングを勉強中です。

    Cのプログラミングを勉強中です。 Aの値のBに対する割合を表示すしたいのですが、以下のように記述してもうまくいきません。 どこを直したらよいか教えていただけますか。 #include <stdio.h> int main(void) { int n1 , n2 ; printf("二つの整数を入力してください。\n"); printf("整数A:"); scanf("%d", &n1); printf("整数B:"); scanf("%d", &n2); printf("Aの値はBの%d%%です。\n" , n1 / n2 * 100 ); return(0); }

  • 整数を3つ読み込み、一番大きいものを表示するプログラム

    3つが違う数であるとしてこうしたんですが、 #include<stdio.h> int main() {int a,b,c; scanf("%d",&a); scanf("%d",&b); scanf("%d",&c); if(a>b && a>c){ printf("%d\n",a);} if(b>a && b>c){ printf("%d\n",b); if(c>a && c>b){ printf("%d\n",c); }}return 0;} で、コンパイルはできたんですが、実行できません。3つの数値を入力してもその一番大きい数が出てきません。ifの条件は間違ってはいないと思うんですがやはり、最大が2つあるときのことを考えないとできませんか?

  • 3つの整数が等しいかどうか調べるプログラム

    3つの整数が等しいかどうか調べるプログラムがよくわからないので、どなたか教えていただけないでしょうか?ちなみに、わからないながらに作ってみました。 #include <stdio.h> int main(void) { int x, y, z; puts("3つの整数を入力してください。"); printf("整数1:"); scanf("%d",&x); printf("整数2:"); scanf("%d",&y); printf("整数3:"); scanf("%d",&z); if (x==y==z) puts("3つの整数の値は同じです。"); else puts("3つの整数の値は違います。"); return (0); }

  • 平均を求めるプログラムを作ったのですが答えが0.0

    としか出ません。 #include<stdio.h> void main (void) {   double a; double b;   double c; printf("Aを入力する"); scanf("%lf",&a); printf("Bを入力する"); scanf("%lf",&b); c=(2*a*b)/(a+b); printf("平均値は"); printf("%8.6lf",c); } というプログラムを作ったのですが、プログラムはコンパイルするのですが出てくる答えは0.000000しか出ません。ほかにもよく0.0000という答えが出ることがあります。原因を教えていただけませんでしょうか。 

  • 打ち込んだ数字が素数かどうか判断するプログラム

    数字をキーボードから入力し、その数字が素数がどうかを判断するプログラムを打ちたいのですが、うまくできません。 コンパイルはできるのですが…。 どなたか間違っているところを教えてください。 #include<stdio.h> int main ( void ) { int a,b,indicator=1; printf("正の整数:"); scanf("%d", &a ); /* indicator=1.......素数でない indicator=0.......素数である */ if(a<=1){ indicator=1; } else { for(b=2;b<=(a-1);b++) { if(a%b == 0){ indicator=0; } } if(indicator==1) { printf("%dは素数ではありません\n",a); } else if (indicator==0) { printf("%dは素数です\n",a); } } return 0; }

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }

専門家に質問してみよう