• ベストアンサー

printfの動作に関する質問

コンパイラ bcc OS WindowsXP HomeEdition 開発言語 C 変数tempを unsigned long temp; と、宣言して、 printf("%15ld",temp); で値を表示していくと、unsignedで宣言しているのに、マイナスの値が出現します。 tempは、unsigned longの定義域ぎりぎりまで使います。 多分、2の補数としてマイナスを表現している関係かと思いますが、この現象を回避する方法はないのでしょうか?

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

  • ベストアンサー
  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.2

ldではなくluだと思います。 (uは符号無し十進数の記号)

shirousa01
質問者

お礼

回答ありがとうございます。 なにやら、大量に同じ意味の返信が来て困っていますが、一番早く正確な情報を下さった、この方にポイントを振って終了したいと思います。 参考としていたものに、整数型はdとしか書いてなかったので、今回uというものを教えていただき非常に参考になったと判断します。 殆どのサイトでもdとしか書いていないもので、dしかないのかと思っていましたが、まだまだあるものですね。

その他の回答 (3)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

printf("%15lu",temp); として下さい。

  • THX1138
  • ベストアンサー率51% (108/208)
回答No.3

No.1 です。 すみません間違えてました o ではなく u です。 o は octal の8進ですね こっちには MSDN の URL を貼っときます

参考URL:
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_printf_type_field_cha
  • THX1138
  • ベストアンサー率51% (108/208)
回答No.1

書式指定子 d は符号付き整数用です。 符号なし整数の場合は o を使ってください。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html#lbAK

関連するQ&A

  • unsigned long long 型のフォーマット指定子

    unsigned long long 型の変数の値を表示したいのですが、 フォーマット指定子は%ldですか? よろしくおねがいします。

  • MicroC コンパイラ 変数宣言

    MicroC コンパイラ 変数宣言について質問です BYTE tmp1; WORD tmp2; なる定義があったとして 変数型範囲はどの範囲になるのでしょう 下記の定義は見つかったのですが 上記は分かりません 変数型 バイト数 範囲 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 float 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

  • PICのCCSコンパイラでのlong

    現在、PIC16f690のプログラムをCCS社のコンパイラを用いて作成しています。 longの変数に数値を入れ、それをPCにシリアル通信で表示しています。 long digi1; long digi2; digi1 = 500; digi2 = 500; printf("%lu",digi1); printf("%lu",digi2); 上記のような時、digi1の値はPCの通信ソフトでは,500と表示されます。 しかし、disi2は244と表示されます。 多分ですが、500 - 256 = 244 でint がオーバーフローしたような状態になっていると推測されます。 変数をlongで宣言しているのに、上記のようなことはありえるのでしょうか? コンパイラのバグでしょうか? なにかお分かりになられる方がいらっしゃいましたら、何卒ご教授よろしくお願い致します。

  • 変数の型でlong longとunsigned long longと言うのは何ですか?

    教えていただきたいのですが、変数の型にlong longやunsigned long long なるものがあると聞いたのですが、どのようなものでしょうか? また、どのように宣言するのでしょうか?通常のlongなどと同じ要領で宣言し てやれば良いのでしょうか? もし、この型がある場合に、制約はあるのでしょうか?Unixでしか使えないとか の制約等ありましたらぜひ教えてください。 お願いいたします。

  • C言語での変数の書式設定

    こんばんは。 このたびC言語を学びはじめたのですが、変数の書式設定の部分で分からない部分があったので、質問させていただきました。 分からない部分というのは%ld,%hd,(%lf)(%hf)です。(()内に書いたのは存在するか分かりませんが・・・。) これらはshortやlongで整数(実数)を表現する書式だと書いてあったのですが、具体的に何がどう違うのかがよくわかりません。 ためしにlong型で宣言した変数を%hdで表示してみたらshort型で表現できる数のみしか正常に表示されませんでした。しかし、short型で宣言した変数を%ldで表示してみても何も変化が見られません。また、実数に関してはよくわからない値が返ってきてしまいました。 変数で宣言した型と実際に使う書式が合致するか否かでは一体何がどう変化するのでしょうか? 初歩的なことかもしれませんが、以上の疑問の答えを知っていらっしゃる方がいましたら、どうかご教授ください。お願いいたします。

  • 最初に使う変数のゼロクリアについて

    変数宣言をしてその変数を使用する場合、ゼロクリアというのは常識なのかも知れませんが、フォートランはデフォルトでゼロクリアになっていたと理解しています。てっきりそうだと思っていたのですが、フリーのフォートランコンパイラg95はゼロクリアになっていないみたいです。すなわちg95では変数宣言して値を明示的に与える前に使用するとゼロと思っていたのがとんでもない値になっていました。 コンパイラの仕様を読んでおくというのは数値計算を行う上で重要なことだと考えます。 前置きが長くなりました。質問ですが、コンパイラで変数宣言した時点でゼロクリアになっていないというのは言語としてはどのようなものがあるのでしょうか? 全部なのでしょうか。全部そうだと思っていた方が安全ではあると思いますが。 よろしくお願いします。

  • 変数の扱える範囲

    C言語で、整数型変数の扱える範囲を確認するために 以下のような処理をしているのですが、どうもうまくいきません。 変数に入りうる最大値の値を、2進数の計算ではなく プログラム内で正しく扱われているか確認する方法はないでしょうか? ご存知の方、教えてください<(_ _)> 宜しくお願いいたします。 **********************************************  unsigned long long I; unsigned long A; unsigned int B; unsigned short C; printf("I:%d A:%d byte B:%d byte C:%d byte \n"    ,sizeof(I),sizeof(A),sizeof(B),sizeof(C)); A = B = C = 0; for(I = 0; I <= 4294967295; I++){ A++;B++;C++; if(I>= 4294967290 && I<= 4294967295)    printf("I:%d A:%d B:%d C:%d\n",I,A,B,C); }

  • printfの引数指定でなぜ文字列ポインタがOK?

    C言語初心者です。現在入門的書籍の1冊目を読んで勉強中です。VBAは経験あります。 printf関数について質問です。 引数の指定で通常  printf("書式文字列", 変数で値) のようにしていしますよね。  char a = 'A';  printf("%c", a); ←ここで変数aの値の「A」を渡している と理解しています。 上の例で、書式文字列を省略し、  printf(a); だとエラーがでます。 しかし、文字列の場合  char a[] = "ABC";  printf(a); はエラーにならず、「ABC」と出力されます。 さらに、ポインタを使用して  char a[] = "ABC";  char *b = a;  printf(b); もエラーにならず、上と同様に「ABC」と出力されます。 まず、この2つの例で、エラーとならず、書式文字列が省略できているのが不思議です。 これが書式文字列を省略しているわけではないとするならば、 「printf(a)」=「printf(b)」=「printf("ABC")」ということになりますが、 「printf(a)」のaも「printf(b)」のbも"ABC"の先頭のアドレスを示しているんですよね。 ということは、printf関数の引数の指定方法は  printf(書式文字列 または 文字列の先頭アドレス, 変数) というように考えられるのですが、認識があっているでしょうか? そもそも文字列について、VBAでは文字と文字列の区別はなにも意識せずに扱えたのでやや戸惑っているのですが、C言語では文字列の場合は宣言時に  char a[] のように宣言し、あとは先頭のアドレスで文字列を使っていくという感じなのでしょうか? 初心者なもので何が理解できていないのかもよくわからない状況で、質問がわかりづらいかもわかりませんが、よろしくお願いします。

  • printf文で変数のアドレスを表示することはできますか?

    いま、H8S2368でプログラミングを行っていて、変数に入れたデータをprintf文でシリアルで出力して確認したいと思い、 BYTE cur; long addr; cur = TMR1.TCSR.BYTE; addr = (long)&cur; printf("data:%X add:%X\n\r",cur,addr); このようにプログラムしました。 curに入ったデータはH8S2368マイコンの0xFFFFB3番地のTCSR_1というアドレスなので、一応そのアドレス番地の値も表示したいと思い設定したのですが、 ”data:C0 add:FF” という表示が出てきます。 アドレスが0xFFFFB3と出てこないのはなぜなのでしょうか?

  • 数値の入力について

    C言語です。 #include <stdio.h> #include <stdlib.h> unsigned long input(void); void main(void){ while(1){ printf("%d\n",input()); } } unsigned long input(void){ unsigned long input; do{ printf("入力(1~4294967294 exit=0>"); scanf("%lu",&input); if(input==0) exit(0); while (getchar() != '\n') {} }while ( ( input < 1 )||( 4294967294 < input ) ); return input; } 以上をコンパイルし、実行すると不具合が起こります。 (1)範囲外の数値を入力しても繰り返しされない。 (2)文字を入力しても繰り返しされない。 どうすれば改善されますか? 定義域一杯に使うのはよくないことなのでしょうか? 環境はWindows XP、Borland C++ 5.5.1です。 あと、このコンパイラではlong long型は使用できないのでしょうか? よろしくお願いします。

専門家に質問してみよう