掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28785

longとunsigned long
投稿者---Mr.Boo(2006/11/10 16:23:11)


開発環境
Borland C++ V5.5.1
BccDeveloper 1.2.21
WindowsXP HOME

研修用問題を作成しているのですが、char,short,int,longとそれぞれの
unsignedの値のとりうる範囲を確認させるための問題を作成しました。
それぞれのデータサイズで符号ビットをONさせた場合とOFFさせた場合での
値の確認をさせたいのですが、longとintではunsignedとsignedで同じ値に
なってしまいます。
と言うか、unsignedにしているのにintとlongでは符号がついてしまいます。

文法上も問題ないはずですし、特にunsigned longでは代入している常数も
ULで指定しているので、問題ないはずです。

どなたか、ヒントをいただけませんでしょうか。


#include    <stdio.h>

int main(void)
{
    char            c;
    unsigned char   uc;
    short         s;
    unsigned short  us;
    int    i;
    unsigned int    ui;
    long            l;
    unsigned long   ul;
    

    c = 0x00;
    printf("%d\t",c);
    c = 0x80;
    printf("%d\t",c);
    c = 0x7f;
    printf("%d\t",c);
    c = 0xff;
    printf("%d\n",c);

    uc = 0x00;
    printf("%d\t",uc);
    uc = 0x80;
    printf("%d\t",uc);
    uc = 0x7f;
    printf("%d\t",uc);
    uc = 0xff;
    printf("%d\n",uc);

    s = 0x0000;
    printf("%d\t",s);
    s = 0x8000;
    printf("%d\t",s);
    s = 0x7fff;
    printf("%d\t",s);
    s = 0xffff;
    printf("%d\n",s);

    us = 0x0000;
    printf("%d\t",us);
    us = 0x8000;
    printf("%d\t",us);
    us = 0x7fff;
    printf("%d\t",us);
    us = 0xffff;
    printf("%d\n",us);

    i = 0x00000000;
    printf("%d\t",i);
    i = 0x80000000;
    printf("%d\t",i);
    i = 0x7fffffff;
    printf("%d\t",i);
    i = 0xffffffff;
    printf("%d\n",i);

    ui = 0x00000000;
    printf("%d\t",ui);
    ui = 0x80000000;
    printf("%d\t",ui);
    ui = 0x7fffffff;
    printf("%d\t",ui);
    ui = 0xffffffff;
    printf("%d\n",ui);

    l = 0x00000000;
    printf("%d\t",l);
    l = 0x80000000;
    printf("%d\t",l);
    l = 0x7fffffff;
    printf("%d\t",l);
    l = 0xffffffff;
    printf("%d\n",l);

    ul = 0x00000000ul;
    printf("%d\t",ul);
    ul = 0x80000000ul;
    printf("%d\t",ul);
    ul = 0x7ffffffful;
    printf("%d\t",ul);
    ul = 0xfffffffful;
    printf("%d\n",ul);

    return 0;
}



出力結果は以下のとおり
0 -128 127 -1
0 128 127 255
0 -32768 32767 -1
0 32768 32767 65535
0 -2147483648 2147483647 -1
0 -2147483648 2147483647 -1
0 -2147483648 2147483647 -1
0 -2147483648 2147483647 -1
下4行の出力が、int, unsigned int, long, unsigned longの順になっています。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:longとunsigned long 28787 YuO 2006/11/10 16:26:39
<子記事> Re:longとunsigned long 28796 たかぎ 2006/11/10 19:31:58


No.28787

Re:longとunsigned long
投稿者---YuO(2006/11/10 16:26:39)


>それぞれのデータサイズで符号ビットをONさせた場合とOFFさせた場合での
>値の確認をさせたいのですが、longとintではunsignedとsignedで同じ値に
>なってしまいます。
>と言うか、unsignedにしているのにintとlongでは符号がついてしまいます。
>文法上も問題ないはずですし、特にunsigned longでは代入している常数も
>ULで指定しているので、問題ないはずです。

・BCCにおいて,intとlongはサイズが等しい
・printfの%dは符号付き整数を扱う



この投稿にコメントする

削除パスワード

No.28788

Re:longとunsigned long
投稿者---Mr.Boo(2006/11/10 16:48:24)


>・BCCにおいて,intとlongはサイズが等しい
>・printfの%dは符号付き整数を扱う
YuOさん、有難うございます。
intはサイズがOSに依存し、intとlongはWindowsXPでは同じサイズなのは理解しております。
そのために、わざわざshortでの出力を確認するようにしております。

私が愛用しているC言語の教則本(The C Primer THIRD EDITION C言語入門 第3版)では、printfの書式指定では%dは“引数を10進数として出力”とのみされており、%uを“引数を符号なし10進数として出力”とされていたので、unsignedが使用できると考えました。
また、実際にshort, charでは%dのままで符号付/符号なしの出力ができているので、問題ないと考えましたが、long(4バイト整数)ではだめなのでしょうか?

それと、念のためVC++2005 Express Editionでも確認しましたが、同じ結果でした。
同じく、VC++2005 Express EditionでC++としてcoutを使うと問題なく出力できました。

printfはchar,short,int,longで扱いが違うのでしょうか?



この投稿にコメントする

削除パスワード

No.28789

Re:longとunsigned long
投稿者---keichan(2006/11/10 17:04:43)


%d 又は %i は「int型の実引数をdddd形式の符号付き10進表記に変換する。」
と規定されています。(JISX3010)
ですので、int幅未満の変数を指定する場合、まず int幅に拡張され評価されます。
例)
char -> int
short -> int


>printfはchar,short,int,longで扱いが違うのでしょうか?
No.
printfに指定する書式を間違えているだけです。


この投稿にコメントする

削除パスワード

No.28790

Re:longとunsigned long
投稿者---Mr.Boo(2006/11/10 17:16:24)


>%d 又は %i は「int型の実引数をdddd形式の符号付き10進表記に変換する。」
>と規定されています。(JISX3010)
>ですので、int幅未満の変数を指定する場合、まず int幅に拡張され評価されます。
keichanさん有難うございます。
お教えいただいた説明でよく解りました。

unsignedのintとlongを出力する場合は%uで出力するように変更します。

有難うございました、解決いたしました。


この投稿にコメントする

削除パスワード

No.28791

Re:longとunsigned long
投稿者---Blue(2006/11/10 17:21:18)


>unsignedのintとlongを出力する場合は%uで出力するように変更します。
longは l をつける("%lu")べきなのではないでしょうか?

ちなみに、shortの場合は"%hu" です。


この投稿にコメントする

削除パスワード

No.28801

Re:longとunsigned long
投稿者---RiSK(2006/11/10 22:31:56)


# オフトピ
# ちょいとツッコミ

>%d 又は %i は「int型の実引数をdddd形式の符号付き10進表記に変換する。」
>と規定されています。(JISX3010)
>ですので、int幅未満の変数を指定する場合、まず int幅に拡張され評価されます。

intになるのは正しいのですが,それは可変長引数だからであって
書式指定は関係ありません。

「ですので」はおかしい気がします。


この投稿にコメントする

削除パスワード

No.28796

Re:longとunsigned long
投稿者---たかぎ(2006/11/10 19:31:58)
http://takagi.in/


出力結果については、printfの書式の問題なのは既に回答が出ているとおりですが、他にも、いろいろと突っ込みどころがあります。

まず、signed charを使わずにcharを使っているのは、-Kオプションの有無で挙動が変わることを確認させるためなのでしょうか?

次に、符号付き整数型の変数に、その型では表現できない値を代入した場合の動作は、処理系定義の値となるか、処理系定義のシグナルが発生するわけですが、これはBorland C++ Compiler 5.5.1の(処理系定義の)挙動を確認させることが目的でしょうか?

研修用にしては、かなりマニアックなお題のような気がします。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧