徹底解析C語言的unsigned!使用方法、注意事項與常見誤解完整指南

前言

在 C 語言中,處理整數型資料時有「有符號(signed)」與「無符號(unsigned)」兩種。特別是 unsigned 型,被視為不會有負值的整數型,在特定用途上非常有用。然而,如果在未了解其特性的情況下使用,可能會引發意想不到的錯誤。 本文將詳細說明 C 語言中 unsigned 的使用方式與注意事項。透過具體的程式碼範例,了解 unsigned 的優點與風險,並能適當地加以運用。

unsigned 是什麼?基本的理解

unsigned 是什麼?

C語言中,對整數型別(intchar 等)指定 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 char10 ~ 255
unsigned short20 ~ 65,535
unsigned int40 ~ 4,294,967,295
unsigned long4 或 8視環境而定
unsigned long long80 ~ 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 型的變數 num1num2,分別賦予 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 中,unsignedsigned 的運算速度幾乎沒有差異對策unsigned 是否使用,應該根據 資料的意義而非計算速度 來判斷。

總結

到此為止,我們介紹了有關 unsigned常見誤解與其對策

本文要點

  • unsigned 並不會提升計算速度
  • signed 之間的轉換需特別留意(尤其是溢位時的行為)。
  • 在迴圈變數使用 unsigned 時,可能會產生無限迴圈的錯誤
  • unsigned char 適合用於二進位資料的處理
  • 將負值賦予 unsigned 時,會產生非預期的行為
只要了解這些,就能在 C 語言中適當地運用 unsigned