C言語で数値計算をしていると、必ずと言っていいほど「2乗($x^2$)」や「累乗($x^n$)」の計算が必要になります。
しかし、PythonやFortranのような他の言語に慣れていると、つい x ** 2 や x ^ 2 と書いてしまい、コンパイルエラーになったり、全く違う計算結果(排他的論理和)になって驚いたりすることがあります。
そのため、単純な掛け算を使うか、標準ライブラリの関数を呼び出す必要があります。
この記事では、C言語で2乗・累乗を計算するための3つの方法(掛け算、pow関数、ビット演算)について、それぞれのメリット・デメリットや使い分けを、サンプルコード付きで詳しく解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
方法1:単純な「2乗」なら「掛け算」が最強
「ある変数を2乗したい」というだけの場面であれば、最も簡単かつ高速な方法は、シンプルに 「自分自身を掛ける」 ことです。
最も基本的で高速な書き方
#include <stdio.h>
int main(void) {
int num = 5;
int square;
// 自分自身を掛けて2乗を計算
square = num * num;
printf("%d の2乗は %d です。\n", num, square);
return 0;
}
実行結果
5 の2乗は 25 です。
num * num という単純な掛け算を行っています。
「なんだ、そんなことか」と思われるかもしれませんが、C言語においてこれが最も処理速度が速く、誤差が出ない確実な方法です。
後述する pow 関数は、内部で複雑な浮動小数点演算を行うため、単純な2乗や3乗程度であれば、x * x や x * x * x と書く方がパフォーマンス的にも優れています。
方法2:汎用的な「累乗(n乗)」なら pow 関数
「2乗だけでなく、10乗や3.5乗など、任意の累乗を計算したい」という場合は、標準ライブラリ <math.h> に含まれる pow 関数 を使用します。
math.hをインクルードして使う
pow 関数は、double pow(double base, double exp) という定義になっており、第一引数に「底(基数)」、第二引数に「指数」を渡します。
#include <stdio.h>
#include <math.h> // pow関数を使うために必要
int main(void) {
double base = 2.0;
double exp = 10.0;
double result;
// 2の10乗を計算
result = pow(base, exp);
// %.0f で小数点以下を表示しない設定
printf("%.0f の %.0f 乗は %.0f です。\n", base, exp, result);
// 2乗根(ルート)の計算例
printf("√2 (2の0.5乗) は %f です。\n", pow(2.0, 0.5));
// sqrt関数を使っても同じ
printf("sqrt(2) は %f です。\n", sqrt(2.0));
return 0;
}
実行結果
2 の 10 乗は 1024 です。
√2 (2の0.5乗) は 1.414214 です。
sqrt(2) は 1.414214 です。
pow(2.0, 10.0) を呼び出すことで、$2^{10}$ を計算しています。
また、pow(2.0, 0.5) のように指数に小数を指定することで、ルート(平方根)の計算も可能です(専用の sqrt 関数を使うのが一般的ですが、pow でも代用できます)。
注意点:戻り値はdouble型
pow 関数の戻り値は常に double 型(浮動小数点数)です。
そのため、整数の計算(例:int a = pow(5, 2);)を行うと、ごく稀に浮動小数点の誤差により 24.9999... のような値になり、整数へのキャストで切り捨てられて 24 になってしまうリスクがあります。
整数の累乗を厳密に行いたい場合は、次の「自作関数」の方法を検討してください。
方法3:pow関数を使わずに整数で累乗計算する(自作関数)
pow 関数の誤差を避けたい場合や、ライブラリを使わずに実装したい場合は、for 文を使って自作の関数を作るのが確実です。
整数専用の累乗関数(mypow)
#include <stdio.h>
// 整数の累乗を計算する関数
long long my_pow(int base, int exp) {
long long result = 1;
for (int i = 0; i < exp; i++) {
result *= base;
}
return result;
}
int main(void) {
int base = 3;
int exp = 4;
// 自作関数で計算
long long ans = my_pow(base, exp);
printf("%d の %d 乗は %lld です。\n", base, exp, ans);
return 0;
}
実行結果
3 の 4 乗は 81 です。
base を exp 回だけ繰り返し掛けるシンプルなループ処理です。
戻り値を long long 型にしているのは、累乗計算は値が爆発的に大きくなりやすく、通常の int 型(約21億まで)ではすぐにオーバーフローしてしまうためです。
整数の計算であれば、この方法が最も安全で正確です。
方法4:【応用】2のn乗なら「ビットシフト」が爆速
プログラミングの世界では、「2のn乗(2, 4, 8, 16, 32…)」を扱う場面が頻繁にあります。
この場合に限っては、掛け算も pow も使わず、ビットシフト演算子 << を使うのが常套手段です。
1を左にシフトして2の累乗を作る
#include <stdio.h>
int main(void) {
int n = 8;
// 1 を nビット左にシフトする = 2のn乗
int result = 1 << n;
printf("2の%d乗は %d です。\n", n, result);
return 0;
}
実行結果
2の8乗は 256 です。
コンピュータ内部では数値は2進数で扱われています。
1 (2進数で 0000 0001)を左に1つずらすと 2 (0000 0010)、2つずらすと 4 (0000 0100)になります。
つまり、1 << n という記述は $2^n$ を計算するのと同義であり、CPUレベルで最も高速に処理されます。
ビットフラグの管理や、メモリサイズの計算などで頻出するテクニックです。
注意!「^」は2乗の演算子ではありません
C言語の初心者が最もハマりやすいのが、^ 演算子の扱いです。
多くの数式やテキストで 2^3 は「2の3乗」を表しますが、C言語において ^ は 「排他的論理和(XOR)」 という全く別のビット演算を行う記号です。
#include <stdio.h>
int main(void) {
// 期待する結果:2の3乗 = 8
// 実際の結果:2(0010) XOR 3(0011) = 1(0001)
int mistake = 2 ^ 3;
printf("2 ^ 3 の結果: %d (8ではありません!)\n", mistake);
return 0;
}
実行結果
2 ^ 3 の結果: 1 (8ではありません!)
エラーが出ずにコンパイルが通ってしまうため、計算結果がおかしい時の原因として見落としがちです。十分に注意しましょう。
C言語のスキルを活かして年収を上げる方法
以上、C言語での2乗・累乗の書き方について解説してきました。
C言語を扱えるエンジニアは比較的希少価値が高く、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



