[C++]int型メモ

constexpr
記事: 5
登録日時: 10年前

[C++]int型メモ

投稿記事 by constexpr » 10年前

掲示板投稿の写し。逐一引用等をまとめるのも面倒なので、メモ。きっと今後も似たような話をすることがあるだろうから。

[hr]
Plain ints have the natural size suggested by the architecture of the execution environment; the other signed integer types are provided to meet special needs.
int型は実行環境における自然なサイズで表現されると書かれている。つまり、規格には32bitや16bitと言ったルールは存在しない。
たまたま、偶然にも32bitや16bitで表現されることが多いだけである。各コンパイラがドキュメントで警告しているように、int型のサイズは実行環境に依存することを踏まえ、サイズに依存するコードを書いてはいけない。上記の記述は初心者の誤解を産みがちで、オーバーフローよりもずっと「危険」なことに繋がりかねない。もしかしたら今後intは64bitが当たり前の時代だって来るかもしれない。
that is, large enough to contain any value in the range of INT_MIN and INT_MAX, as defined in the header .
int型の最大値はINT_MAX、最小値はINT_MINとして、標準ヘッダclimitに定義される。これはCの標準ライブラリだが、intに関しての規格はC言語と互換があるため、問題ない。
ただし、互換があるだけでC++でこれはおすすめしない。C++標準ライブラリlimitsにstd::numeric_limitsがあるので、これを使うべきである。std::numeric_limits::max()とすれば最大値を取得できる。
The signed and unsigned integer types shall satisfy the constraints given in the C standard, section 5.2.4.2.1.
符号あり、符号なしのint型はC言語規格と互換がある。

標準ヘッダcstdintに、C++11以降では型のサイズをある程度指定できる型が定義されている。以下は一例。
実行環境における最大の整数型
intmax_t
最低でも指定bit数を持つ型
int_least32_t
int_least16_t
最低でも指定bit数を持ち、最速で計算できる型
int_fast16_t
int_fast32_t

C++03までの環境でも、boostに同様のものがある。boost.integerのほうが汎用的である。
ちなみに各コンパイラ固有の、専用のサイズ指定の型がある場合があるが、一般的には型のサイズは標準ライブラリかboostの型を使うべきである。組み込みは考えない。
Unsigned integers shall obey the laws of arithmetic modulo 2n where n is the number of bits in the value representation of that particular size of integer.
符号なしint型に関しては、2nを法とするモジュロ算術に従うことが定められている。つまり、符号なし整数型はオーバーフローしない。
std::numeric_limits::max() + 1
の結果は0になることが定められているということだ。


規格の文面はWorking Draft, Standard for Programming Language C++ N4296より引用した。
§ 3.9.1 Fundamental types [basic.fundamental]
これはワーキングドラフトであり正式な規格ではないが、intに関する文面はC言語と互換が残されていることもあり、ほとんど変更されていない(おそらく今後もされることはない)ため、問題はないだろう。
最後に編集したユーザー constexpr on 2015年5月02日(土) 07:39 [ 編集 3 回目 ]

kiuri
記事: 20
登録日時: 12年前

Re: [C++]int型メモ

投稿記事 by kiuri » 10年前

いつも思うのですが規格をここまで理解しなければいけない、あるいは理解しようとする人がここの掲示板に質問に来るかと言われると微妙では?
寧ろ質問者のレベルによってはこの解答を見ただけで難しすぎて嫌になる気が…

勿論規格を理解し遵守することは大切ではあると思いますが…

constexpr
記事: 5
登録日時: 10年前

Re: [C++]int型メモ

投稿記事 by constexpr » 10年前

kiuri さんが書きました:いつも思うのですが規格をここまで理解しなければいけない、あるいは理解しようとする人がここの掲示板に質問に来るかと言われると微妙では?
何か根本を勘違いされていますね。
私は初心者に対して規格を理解しろとは言っていないし、そのような意図で述べたわけではありません。

例えば、私の文章から規格の文面を削ってみた場合を考えてみてください。更に言えば、規格で定められているという点も削ってみましょうか。
あなたはその文章を、信じますか?信じませんか?

kiuriさんがどういった方が存じませんが、一般論として根拠となる出典を示すのは当たり前の事ですし、それくらいはわかっているかと思います。
もし出典のない内容ならばそれを安易に信じるべきではないし、信じる努力をするならば自身で根拠を調べるのが普通の勉強です。

確かに今回の件は細かい話だと自身でも理解しています。しかし、質問者は自身が勉強した内容に不安を持ったり、オーバーフローへの恐怖なども感じ取れます。
私には、「根拠を求める姿勢がある人物」だと感じたのです。故に誤解を生みかねない表現を指摘させてもらい、また根拠となる引用をしました。

つまり、私は規格の理解を強いているのではなく、自身の発言の出典を明示し、信憑性の高い情報を提供することを目的としているのです。

また別の観点から言わせてもらえば、質問者がもし根拠も出典もない文章を信じる人間ならば、そのような人間には一生かかってもロクなプログラミングなどできないと思います。
日本人位だと思いますよ、規格書をロクに読まないのは。規格は取扱説明書みたいなものなのですから、わからなければ公式の取説を読むのは至極当然の事です。文章だって、中学レベルの英語と単語を検索する環境があれば誰だって読める内容なのですから。
この掲示板は確かに、勉強する気があるのか?根拠の価値すら理解できないのか?と思うほどネットの情報を鵜呑みにしたり会話にならない人が居ます。しかし本当にそうかどうかなど文章では憶測を出ませんし、本当にそういう人間なら幾ら相手したところで無駄、そうでない人間であれば根拠に基づいた文章を糧にしてくれるのですから、この掲示板であろうが私は根拠を明示する方針で居ます。

また、ここはオープンなネットであり、検索してヒットした見ず知らずの誰かが読む可能性を持っています。そこで誤った情報や語弊のもととなる情報をそのままにするのは、風習として間違っていると思います。誰かが読んだ時に信じられるようなトピックとしての完成度も私は必要だと考えています。

kiuri
記事: 20
登録日時: 12年前

RE: [C++]int型メモ

投稿記事 by kiuri » 10年前

constexpr さんが書きました:何か根本を勘違いされていますね。
私は初心者に対して規格を理解しろとは言っていないし、そのような意図で述べたわけではありません。
確かに仰るとおりこちらが誤解していました、すいません。
ただ、そこを踏まえた上で聞いてみたいことと、意見があります。
それと久々に長文を書くので読みにくく理解しにくいかもしれませんが御了承ください。
constexpr さんが書きました:kiuriさんがどういった方が存じませんが、一般論として根拠となる出典を示すのは当たり前の事ですし、それくらいはわかっているかと思います。
もし出典のない内容ならばそれを安易に信じるべきではないし、信じる努力をするならば自身で根拠を調べるのが普通の勉強です。
まず最初に言っておかないといけないこととして、根拠の大切さについてですね。
勿論存じておりますし実践もしています。
例えば、私も他人に説明するためのスライド等に引用した信用のおける文献を残しますし、逆に他人のスライド等でそうなっていない場合話は聞きますが、こちらが後々調べて正しい内容であったとしても評価は一切しないようにしています。
学生なのでやり過ぎだろうと言われることもありますが、順当に卒業すれば身を置くはずの世界でもそうなっているのだから、学生であってもそうあるべきと信じています。
また勉学においても、基本的には根拠のあるものを参考にし、もしなければ根拠を探すようにしています。

さて一応こちらも根拠の大切さを理解しているということを明記した上で、お聞きしたいことがあります。
貴方は普段すべての物事に対して同様のことを実践なさっているのでしょうか?

その大切さを理解していながら、私は自分の将来に関係のある内容でしかそこまで根拠を求めません。
何故なら必要でないことが多く、必要であったとしても大して問題がないことが多いからです。
逆に大した問題がなくても自分が必要だと感じたら勝手に調べるでしょう。

例えば貴方が病気になり病院で軽い食あたりだと診断を受け、お薬を処方してもらうとします。
この時貴方は医師が何故その診断名を出し、何故そのお薬を出したか、根拠を求めますか?
自分の体のことなので根拠を求める必要はありますが、普通は求めないでしょう。
だって医師の言うことなんだから正しいはずでしょうし、さらに多少間違っていたところでたいして問題がないからです。
ですが私は根拠を求めます。何故ならそれが専攻科目で必要だからです。

この掲示板でも同じだと私は思うんです。医師が回答者で、患者が質問者になっただけだと。
その上で考えてみてください、毎回医師が貴方の病気をこれだと鑑別した理由は「いついつのだれだれのどこそこで検証した内容をまとめた論文」、「どこどこの大学のだれそれ教授の執筆された成書のこのページからあのページ」等と言われたらどうしますか?
普通の患者さんならもうその先生にかかることはないでしょう。だって必要ないし知識がないと理解できないでしょうから。

確かに根拠を求めることは大切ですし、それをする人のために明記しておくことも必要でしょう。
ですが、この掲示板はその層にターゲットをおいているわけではないと思うし、本当に必要な人は勝手に調べてここを見ることがないと思うのです。
さらに言うと、プログラミングって難しいなぁ、なんて思わせてしまいターゲット層が減ってしまっては意味がないと思うのです。
ただ、根拠を書いておくことで回答者側(というか、回答しようとする意欲のある人)のメリットになることもあるとは思うので、日記に書いておいてそこに誘導する、そうすれば両方の層にとって有用なのではないかなぁと思うのです。

結局何が言いたいかといえば、最後の部分で、その他はそこへ至る肉付けなので読みにくければ無視してください。

PS.
その人のスタンスやこの掲示板への期待の方向が関係すると思うので別に非難してるわけではないのですが、そう取れるような内容になっている気がしなくもないので先に弁明しておきます。

constexpr
記事: 5
登録日時: 10年前

Re: [C++]int型メモ

投稿記事 by constexpr » 10年前

kiuriさん、ご意見ありがとうございます。

医者と患者というたとえを考えるなら、二種類の人が居ますね。将来医者になりたいと考えている人と、そうでないただ対処だけしたい人と。
今回の件で言えば、私は質問者は前者だと判断したのです。また、もしC++でプログラミングを勉強するなら、今回の内容など初歩の初歩で、勉強するならいずれ近い将来に辿り着く事です。私は難しい話をしたとは一切思っていません。今回の内容はただのルール説明です。例えるなら「サッカーで手を使ってはいけません。ただしキーパーだけは使えることもある」、程度の内容です。
設計理論を説いたわけでも、テクニックを紹介したわけでもなく、最も基本の型のルールを説明することが、難しいとはやはり思えません。

この掲示板は方針が曖昧なので、どちらをターゲットにおいているわけでもないと思います。前者ならそれなりの対応をするし、後者だと判断したら他の人に任せて回答しないことにしています。
また、正直あの程度の話で減る層なら、ほっといても消えると思いますので、減る人間の事は考えておりません。

日記を書いてリンク、という提案ありがとうございます。実は以前そのような手段を取ったことがあります。今回は直接書きましたしそれでいいレベルだと思っていますが、今後も内容次第で検討してみようと思います。

ISLe
記事: 2650
登録日時: 14年前

Re: [C++]int型メモ

投稿記事 by ISLe » 10年前

件のトピックの質問文には、
LoadGraphを使って
という記述があるのでDXライブラリを使っていると分かります。
DXライブラリを使うプログラムはWinMainからプログラムが開始されます。
わたしには規格を根拠にするという前提自体に根拠の甘さを感じます。

constexpr
記事: 5
登録日時: 10年前

Re: [C++]int型メモ

投稿記事 by constexpr » 10年前

ISLe さんが書きました:DXライブラリを使うプログラムはWinMainからプログラムが開始されます。
そうですか。誰に強いられたのかは知りませんが、Win32アプリケーションをmain関数から開始させることも可能です。
プログラムがWinMainから始まるという点はVisualC++でそういう設定でコンパイルした場合の話であって、設定を変えれば良い話だし、そもそもそれはC++の問題ではありません。

DXライブラリを使っていたらC++の規格がC++の言語機能の解説の根拠として甘いとは心外ですね。
規格に準拠していない環境が存在するという点からの発言でしょう。ですがC++という言語についての根拠として曖昧だとは私は思いませんし、弱いとも思いません。それとも、存在する全てのコンパイラのドキュメントを照合し、実行テストを行い、結果をまとめた上で発言したほうが良かったのでしょうか。わざわざ取り上げるほどに準拠しない環境が多く存在する事実が見受けられるのなら、規格では甘いという発言は無下にはできないとも思います。しかし今回の件にすら準拠していない環境はC++といえるレベルではない処理系ではないでしょうかね。言語の最新規格などとは違い、言語の根本部分で、C++言語との互換を維持するほどの範囲にそういう話は前提と置いて問題無いと思います。少なくともDXライブラリがと言われても「そうですか」としか私は言えないです。

しかし、そういう方(追記;そういう方とは、どんな前提レベルでも規格を守らないコンパイラのせいで規格では根拠として満足できない方)も居ると頭に留めることにしますね。今後は「規格すら守れないコンパイラを使っている場合」に対して何かしらフォローとなる文章を含めるようにしましょう。コメント有難う御座いました。
最後に編集したユーザー constexpr on 2015年5月03日(日) 21:40 [ 編集 2 回目 ]

アバター
夢幻ノ月夜
記事: 143
登録日時: 10年前

Re: [C++]int型メモ

投稿記事 by 夢幻ノ月夜 » 10年前

真面目に全部読んでしまいましたが
あなたたちすごいですねぇ…
よくこんなに長文で討論を…
尊敬しますわホントに…(´・ω・`)
今の俺には無理ですわ

ISLe
記事: 2650
登録日時: 14年前

Re: [C++]int型メモ

投稿記事 by ISLe » 10年前

わたしは、constexprさんの書いた内容が正しいか正しくないかなどには触れていません。
あのトピックに書き込む根拠としては甘い、と言っているのです。
そもそもC++に準拠していないのに、準拠しなければC++ではないとか真顔で言ってるのを滑稽だと思いました。

constexpr
記事: 5
登録日時: 10年前

Re: [C++]int型メモ

投稿記事 by constexpr » 10年前

ISLe さんが書きました:あのトピックに書き込む根拠としては甘い、と言っているのです。
私は十分だと言っています。甘いというのであれば的確な根拠の提示の仕方を教えていただけるとありがたいのですが。
そもそもC++に準拠していないのに、準拠しなければC++ではないとか真顔で言ってるのを滑稽だと思いました。
根拠が甘いとか言いながら、そもそも正しい訳でもない内容を真顔で書き込むのを滑稽だと思いました。

VisualC++のWin32アプリケーションがC++に準拠していない(する気がない?)から、C++の規格が根拠として弱く、基本型の規格すら守れなければC++ではないという発言は矛盾していると。

基本型の規格「すら」守れなければC++ではないといったのは、ある程度準拠できていない環境でも事実上としてC++と呼べると考えているからです。個人的なその許容範囲を大きく超えているという話であります。質問者がC++だと言ったように全然規格を守らないVisualC++もC++だと認識されているし、C++準拠の資産をほぼちゃんと動作させられる以上、許容範囲内だと思っています。
亜種のC++であっても、C++と呼ばれる以上は、オリジナルのC++の規格を引き出すことが間違いだとは思いません。処理系で規格に準拠していなければ例外として処理すればいいし、準拠していれば規格を引き出せば終わり。
最後に編集したユーザー constexpr on 2015年5月04日(月) 01:25 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 14年前

Re: [C++]int型メモ

投稿記事 by ISLe » 10年前

わたしの考え方は次の日記に書いたので改めて書きませんが

件のトピックとは別のトピックにおいて、C++の一般的なコードとして、明らかなデタラメが書かれていたりするのは気にしないのでしょうか。
単に見ていないだけですかね。


(追記)
この手の熱いひとはどうしてわたしの書き方の真似ばかりするのでしょうね。
過去ログ見たらまったく同じことしてるひとがたくさんいるのが分かると思います。
#まさか同一人物ではないでしょうが
どんなひとがそういうことしてるかを知ったら恥ずかしくて死にたくなるかもしれないので知らないほうが良いかもしれません。
最後に編集したユーザー ISLe on 2015年5月04日(月) 17:40 [ 編集 1 回目 ]