質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

2720閲覧

callocを使う意義

_nyannyan_

総合スコア124

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2015/08/27 04:05

C言語のcalloc関数は確保した領域のすべてのビットは0になるそうです。
しかし、「int型やdouble型などの型ではすべてのビットが0の時は必ず値がxになる」というような規定があるのでしょうか?

追加の質問
これを調べようとJISX3010を見ようしたら有料でした。
無料で読めるCの規格(C99でなくてもよい, できれば日本語)はないでしょうか。
おすすめの方法を教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

基本的に、整数型であれば、0であると言えるが、
そうでない場合には特に規定はない様です。

詳細

C99のドラフトを見ると、
6.2.6 Representations of types
6.2.6.1 General
に、

The representations of all types are unspecified except as stated in this subclause.

という記述があるので、どの様に表現するかについては、基本的には余り規定がないようです。
その上で、

整数型については、
6.2.6.2 Integer types
の節に、

If there are N value bits, each bit shall represent a different power of 2 between 1 and 2^(N−1)

という記述があるので、全てのビットが0であれば0と考えて良いと思います。

浮動小数点とポインタについては、
7.22.3.2 The calloc function
に、

The calloc function allocates space for an array of nmemb objects, each of whose size
is size. The space is initialized to all bits zero.296)

とあり、その注293には、

Note that this need not be the same as the representation of floating-point
zero or a null pointer constant.

とあるので、全てのビットを0にしても、浮動小数点の0だったり空ポインタであったりする保証は
ない様です。

ちなみにJIS X 3010:2003で同様の個所を引用すると、
以下の個所です。

6.2.6.1 一般的規定

すべての型の表現は,6.2.6 に規定されているものを除き,未規定とする。

6.2.6.2 整数型

N個の値ビットがある場合,それぞれのビットは 1 から 2N−1までの,異なる 2 のべきを表現しなければならない。

7.20.3.1 calloc関数

calloc 関数は,大きさが size であるオブジェクトの nmemb 個の配列の領域を割り付ける。
その領域のすべてのビットは,0 で初期化する(※251)。

に対する注251

ここでの表現は,浮動小数点数の 0 の表現や空ポインタ定数の表現と同じである必要はない。

投稿2015/08/27 07:46

eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_nyannyan_

2015/08/27 08:06

ありがとうございました とてもわかりやすかったです
guest

0

intについては全ビットをゼロにすれば値もゼロですが、浮動小数やポインタではゼロだと保証されません。

MEM09-C. メモリ割り当て関数がメモリを初期化すると仮定しない

もっとも、IEEE 754形式ではゼロクリアしたものが0として評価されますし、ポインタもヌルポインタ=0となる環境が多いので、実用上はそのまま通ってしまうことも多いです。

投稿2015/08/27 04:55

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ココ に説明されていた 究極の“気持ちよさ” という説明が妙に笑えました :p

冗談はさておき、2番目の説明にある通り、特定の処理系(おそらく特に組み込み系)では重要な意味を持つ場合が有るようです。
自分は素人なので良く分かりませんが・・・

投稿2015/08/27 08:05

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

追加の質問への回答。
JIS規格票は、
http://www.jisc.go.jp/app/JPS/JPSO0020.html
で、ブラウザ上での参照だけなら出来ます。ダウンロードや印刷は出来ないです。

投稿2015/08/27 05:32

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_nyannyan_

2015/08/27 06:38

参考になる情報ありがとうございます 現在はwindows10かOSX(yosemite)をつかっていて、JISのサイトを見てみたのですが、windows7またはwindows vistaでしか動作しないようだったので、諦めました
otn

2015/08/27 12:31

おっとWindows限定とは知りませんでした。FAQから探すとそう書いてありますね。Windows8も未確認とは。 もっと見やすいところに利用環境を書いて欲しいですね。
guest

0

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf
C11のドラフト文書です。

以前私も同じような疑問を感じてはてなで質問したことがあり、
http://q.hatena.ne.jp/1147241365

intは規格上では
・+32767~-32767が表現可能であること
・sizeof short <= sizeof int <= sizeof longであること
しか定められていません。

と回答をもらいました。

投稿2015/08/27 04:24

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問