Article View: fj.lang.c
Article #723Re: printf()について
From: Hirokazu Hayashi
Date: Sun, 15 Feb 1998 00:00
Date: Sun, 15 Feb 1998 00:00
62 lines
2908 bytes
2908 bytes
林@meshです。
matuo wrote:
>#include <stdio.h>
>main()
>{
>printf("%d", 42340);
>}
>というプログラムがあります。僕がつかっているCの本では、
>42340ではなく、-23196と表示される。正しく表示させるには、
>%uを使うと書いてあります。しかし、僕の環境(visuall C++ 4.0)では、
>42340と同じになっています。たぶん、開発環境の発達によって
>改善されたのだと思うのですが、どういう理屈かわからないので、
処理系によって int の実装が違うために起こる現象です。別に改善された
わけではありません。printf の %d は int の幅でスタックからデータを
引いてきて符号付きで文字列にしているので、結果は使っている処理系の
int の実装に依存します。
MS-DOS環境用の処理系、たとえば VC++1.51(MS-C8.0)までのMS系で
は int は16ビット、VC++2.0以降のMS系では int は32ビットで実装
されています。
int が16ビットの処理系だと、
%d -32768(0x8000)~+32767(0x7FFF)
%u 0(0x0000)~65535(0xFFFF)
int が32ビットの処理系だと、
%d -2147483648(0x80000000)~+2147483647(0x7FFFFFFF)
%u 0(0x00000000)~4294967295(0xFFFFFFFF)
という範囲の表示になるので、問題の 42340(0xA564)は、
16ビット系 %d : 0xA564 → -23196 MSBは符号=1なので負値
32ビット系 %d : 0x0000A564 → 42340 MSBは符号=0なので正値
です。
「僕がつかっているCの本」というのはMS-DOS環境またはWin3.1
環境を前提に書かれたCの本、ということでしょう。
MS系を使う場合、16ビット環境と32ビット環境でのソースの同一性を確
保したいのであれば、ただ int と書かずに
符号付き16ビット整数 signed short
符号なし16ビット整数 unsigned short
符号付き32ビット整数 signed long
符号なし32ビット整数 unsigned long
と書けばいいでしょう。(現在のところ ^^;)
#将来 int が64ビットで実装される事になった時は long と short の定義
が今と同じという保証はどこにもありません。なにせコッソリ仕様変更は日常
茶飯事なMSのことなので・・・
では(^^)/~~
--
Hirokazu Hayashi ( forest@mxt.meshnet.or.jp )
Technical Details
Message-ID:
<6c4g7n$iuj$1@meshsv230.tk.mesh.ad.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<01bd3957$77d7a0c0$2a2e21ca@ma24659q>Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 106434,bb414caaa6d5dd8f X-Google-Attributes: gid106434,public From: "Hirokazu Hayashi" <forest@mxt.meshnet.or.jp> Subject: Re: printf()について Date: 1998/02/15 Message-ID: <6c4g7n$iuj$1@meshsv230.tk.mesh.ad.jp> X-Deja-AN: 325068155 Content-Transfer-Encoding: 7bit References: <01bd3957$77d7a0c0$2a2e21ca@ma24659q> Content-Type: text/plain; charset="iso-2022-jp" X-MimeOLE: Produced By Microsoft MimeOLE V4.72.2106.4 Organization: BIGLOBE dial-up user Mime-Version: 1.0 Newsgroups: fj.lang.c