C言語でdiv関数は必要なの?
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Verse(UEFN), Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
C言語で整数で除算と剰余演算をするdiv関数があることはご存知ですか?
C言語では,除算演算子(/)と剰余演算子(%)を利用すれば整数で除算と剰余演算はできます.
なので,div関数の存在意義がよくわからないですよね.
そこで,本記事ではdiv関数の存在意義と使い方を解説します.
目次
div関数
1 2 3 4 |
div_t div(int numerator, int denominator); ldiv_t ldiv(long numerator, long denominator); lldiv_t lldiv(long long numerator, long long denominator); imaxdiv_t imaxdiv(intmax_t numerator, intmax_t denominator); |
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関数の使い方は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <stdlib.h> #include <inttypes.h> int main(void) { int i, i2; long l, l2; long long ll, ll2; intmax_t im, im2; div_t d; ldiv_t ld; lldiv_t lld; imaxdiv_t id; i = l = ll = im = -27; i2 = l2 = ll2 = im2 = 5; d = div(i, i2); ld = ldiv(l, l2); lld = lldiv(ll, ll2); id = imaxdiv(im, im2); printf(" div(%d, %d) = %d ... %d\n", i, i2, d.quot, d.rem); printf(" ldiv(%ld, %ld) = %ld ... %ld\n", l, l2, ld.quot, ld.rem); printf(" lldiv(%Ld, %Ld) = %Ld ... %Ld\n", ll, ll2, lld.quot, lld.rem); printf("imaxdiv(%ld, %ld) = %ld ... %ld\n", im, im2, id.quot, id.rem); return 0; } |
実行結果は以下になります.
-27/5は-5,-27%5は-2になっていることがわかります.
1 2 3 4 5 6 |
$ gcc div.c $ a.out div(-27, 5) = -5 ... -2 ldiv(-27, 5) = -5 ... -2 lldiv(-27, 5) = -5 ... -2 imaxdiv(-27, 5) = -5 ... -2 |
まとめ
C言語で整数の除算と剰余演算をするdiv関数の存在意義と使い方を紹介しました.
div関数は現在は明示的に使う必要はありませんが,C89規格では互換性を保つために必要だったことがわかりました.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!