目次
前言
在 C 語言中,處理整數型資料時有「有符號(signed)」與「無符號(unsigned)」兩種。特別是unsigned
型,被視為不會有負值的整數型,在特定用途上非常有用。然而,如果在未了解其特性的情況下使用,可能會引發意想不到的錯誤。 本文將詳細說明 C 語言中 unsigned
的使用方式與注意事項。透過具體的程式碼範例,了解 unsigned
的優點與風險,並能適當地加以運用。unsigned 是什麼?基本的理解
unsigned 是什麼?
C語言中,對整數型別(int
或 char
等)指定 unsigned
,即可將其作為無符號(不含負值)整數型別來使用。 例如,普通的 int
型別(有符號)可以處理以下範圍的值。int 型(32 位元環境下)
-2,147,483,648 〜 2,147,483,647
另一方面,unsigned int
型因不含負數,而能處理更廣範圍的正值。unsigned int 型(32 位元環境下)
0 〜 4,294,967,295
也就是,使用 unsigned
後,能夠儲存更大的值。unsigned 的基本宣告方式
使用unsigned
時,請在資料型別前加上 unsigned
進行宣告,如下所示。#include <stdio.h>
int main() {
unsigned int num = 3000000000;
printf("%un", num); // 3000000000
return 0;
}
這樣一來,使用 unsigned
就能處理比普通 int
更大的值。unsigned 的資料型與表示範圍
unsigned 的種類與範圍
C語言中,unsigned
可套用於多種資料型別。每種型別的大小與範圍如下表所示。資料型別 | 大小(位元組) | 範圍 |
---|---|---|
unsigned char | 1 | 0 ~ 255 |
unsigned short | 2 | 0 ~ 65,535 |
unsigned int | 4 | 0 ~ 4,294,967,295 |
unsigned long | 4 或 8 | 視環境而定 |
unsigned long long | 8 | 0 ~ 18,446,744,073,709,551,615 |
sizeof()
來確認。#include <stdio.h>
int main() {
printf("Size of unsigned int: %zu bytesn", sizeof(unsigned int));
return 0;
}
unsigned 的使用範例
實際上,利用unsigned
來確認數值的最大值吧。#include <stdio.h>
#include <limits.h>
int main() {
printf("Max unsigned int: %un", UINT_MAX);
return 0;
}
執行此程式碼後,會輸出依環境而定的 unsigned int
最大值。unsigned 的基本用法
unsigned 的宣告與賦值
unsigned
使用時,請按以下方式宣告變數。#include <stdio.h>
int main() {
unsigned int num1 = 100;
unsigned int num2 = 200;
printf("num1: %un", num1);
printf("num2: %un", num2);
return 0;
}
在此程式中,unsigned int
型的變數 num1
與 num2
,分別賦予 100 與 200 的值。使用 unsigned 時的注意事項
signed 與 unsigned 混用導致的錯誤
比較有符號整數 (int
) 與 unsigned int
時,可能會產生意外的結果。#include <stdio.h>
int main() {
int a = -5; // 有符號
unsigned int b = 10; // 無符號
if (a < b) {
printf("a 小於 b\n");
} else {
printf("a 大於 b\n");
}
return 0;
}
在此程式碼中,a
為 -5
,本應小於 b=10
,但 a
會被轉換成 unsigned int
,導致意外的比較結果。
使用 unsigned 的情況與應避免的情況
應使用 unsigned 的情況
✔ 不需要考慮負值的情況(例:二進位資料處理) ✔ 想要最佳化記憶體效率的情況(例:嵌入式系統) ✔ 大量使用位元運算的情況(例:旗標管理)應避免使用 unsigned 的情況
✘ 與有號變數混用的情況(會發生非預期的型別轉換) ✘ 可能會處理負值的情況(會產生非預期的錯誤) ✘ 作為迴圈變數使用的情況(有溢位風險)常見的誤解與其對策(FAQ)
使用 unsigned 會讓計算變快嗎?
誤解 「使用unsigned
,會比 signed
的運算更快」的想法有時會出現。 正解 在現代的 CPU 中,unsigned
與 signed
的運算速度幾乎沒有差異。 對策 ✔ unsigned
是否使用,應該根據 資料的意義而非計算速度 來判斷。總結
到此為止,我們介紹了有關unsigned
的 常見誤解與其對策。本文要點
unsigned
並不會提升計算速度。- 與
signed
之間的轉換需特別留意(尤其是溢位時的行為)。 - 在迴圈變數使用
unsigned
時,可能會產生無限迴圈的錯誤。 unsigned char
適合用於二進位資料的處理。- 將負值賦予
unsigned
時,會產生非預期的行為。
unsigned
。