C LANGUAGE TECHNOLOGY

【C言語】整数の除算と剰余演算をするdiv関数の存在意義と使い方

悩んでいる人

C言語でdiv関数は必要なの?

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity/Vyper,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

C言語で整数で除算と剰余演算をするdiv関数があることはご存知ですか?

C言語では,除算演算子(/)と剰余演算子(%)を利用すれば整数で除算と剰余演算はできます.

なので,div関数の存在意義がよくわからないですよね.

そこで,本記事ではdiv関数の存在意義と使い方を解説します.

div関数

div関数と派生関数を紹介します.

div/ldiv/lldiv/imaxdiv関数は,整数型のnumerator/denominatorの値を計算します.

商と余りは,quot(商)とrem(余り)という名前の2つの整数型メンバを含むdiv_t/ldiv_t/lldiv_t/imaxdiv_tという構造体の中に返されます(メンバの順番は不定).

商は0に近い方に丸められます.

結果はquot*denominator+rem=numeratorを満たします.

div関数の存在意義

div関数の存在意義を紹介します.

GCCでは除算演算子(/)は常に0に近い方に丸めます.

しかし,他のC言語(C89規格)の実装では,除算演算子(/)は負の引数に対してはコンパイラに依存して異なる丸め方をすることがあります.

例えば,-27/5の除算と剰余演算の結果が以下のように異なります.

  • 0に遠い方に丸めた結果:-27/5は-6,-27%5は3
  • 0に近い方に丸めた結果:-27/5は-5,-27%5は-2

なので,div関数は,C89規格で他のC言語の実装と互換性を保つために必要でした.

C99規格以降では0に近い方に丸めますので,現在はdiv関数を明示的に利用する意味はないです.

※Clang/Visual StudioでもGCCと同様の結果になります.

div関数の使い方

div/ldiv/lldiv/imaxdiv関数の使い方は以下になります.

実行結果は以下になります.

-27/5は-5,-27%5は-2になっていることがわかります.

まとめ

C言語で整数の除算と剰余演算をするdiv関数の存在意義と使い方を紹介しました.

div関数は現在は明示的に使う必要はありませんが,C89規格では互換性を保つために必要だったことがわかりました.

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!

友だち追加

独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , ,