🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.c
Article #723

Re: printf()について

#723
From: Hirokazu Hayashi
Date: Sun, 15 Feb 1998 00:00
62 lines
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-mail
References: <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