首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言處理超出 int 範圍的大整數:類型選擇與輸出實戰

     編輯:程式設計綜合問答

問題核心

int i = 100000000000000000;  // 編譯警告:溢位
printf("%d", i);  // 未定義行為

關鍵認知: 若字面值超出類型表示範圍,賦值瞬間已發生截斷/溢位,後續打印毫無意義。

平台相關的整數寬度

環境int 寬度long 寬度指標寬度
16-bit DOS (Turbo C)2 bytes4 bytes2/4 bytes
32-bit Windows/Linux4 bytes4 bytes4 bytes
64-bit Windows (LLP64)4 bytes4 bytes8 bytes
64-bit Linux/Unix (LP64)4 bytes8 bytes8 bytes

標準大整數類型方案

1. C99 標準整數類型 <stdint.h>

#include <stdint.h>
#include <inttypes.h>  // 打印巨集

int64_t  big = 100000000000000000LL;  // 有符號 64 位
uint64_t ubig = 18446744073709551615ULL;  // 無符號 64 位

printf("有符號: %" PRId64 "\n", big);
printf("無符號: %" PRIu64 "\n", ubig);

2. Windows 專用 __int64

// MSVC 專用
__int64 val = 100000000000000000i64;
printf("%I64d\n", val);  // Windows 格式化字串

3. 跨平台通用寫法(推薦)

#include <stdio.h>
#include <stdint.h>

int main() {
    int64_t val = 100000000000000000LL;
    
    // 方法 1:C99 標準巨集(需 C99 支援)
    #ifdef PRId64
        printf("C99: %" PRId64 "\n", val);
    #else
        // 方法 2:手動分段打印(通用)
        char buf[32];
        sprintf(buf, "%lld", (long long)val);  // C++11/C99 long long 至少 64 位
        printf("通用: %s\n", buf);
    #endif
    return 0;
}

超越 64 位:任意精度整數

若需處理 10^100 級別數值,必須引入大數庫:

  • GMP (GNU Multiple Precision):工業標準,mpz_t 類型支援任意大小
  • OpenSSL BIGNUM:密碼學常用,內建模冪運算
  • 手動實現:陣列/鏈表存儲數位,實現加減乘除(教學用)

GMP 快速上手

#include <gmp.h>

int main() {
    mpz_t huge;
    mpz_init_set_str(huge, "123456789012345678901234567890", 10);
    gmp_printf("大數: %Zd\n", huge);
    mpz_clear(huge);
    return 0;
}
// 編譯:gcc -lgmp main.c

總結建議

  1. 先確認數值範圍,選擇 int64_t/uint64_t 滿足 99% 場景
  2. 使用 inttypes.h 巨集確保跨平台打印正確
  3. 超出 64 位引入 GMP,勿手動造輪子
  4. 編譯開啟警告 -Woverflow -Wconversion 捕獲隱式截斷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved