int i = 100000000000000000; // 編譯警告:溢位
printf("%d", i); // 未定義行為
關鍵認知: 若字面值超出類型表示範圍,賦值瞬間已發生截斷/溢位,後續打印毫無意義。
| 環境 | int 寬度 | long 寬度 | 指標寬度 |
|---|---|---|---|
| 16-bit DOS (Turbo C) | 2 bytes | 4 bytes | 2/4 bytes |
| 32-bit Windows/Linux | 4 bytes | 4 bytes | 4 bytes |
| 64-bit Windows (LLP64) | 4 bytes | 4 bytes | 8 bytes |
| 64-bit Linux/Unix (LP64) | 4 bytes | 8 bytes | 8 bytes |
<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);
__int64// MSVC 專用
__int64 val = 100000000000000000i64;
printf("%I64d\n", val); // Windows 格式化字串
#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;
}
若需處理 10^100 級別數值,必須引入大數庫:
mpz_t 類型支援任意大小#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
int64_t/uint64_t 滿足 99% 場景inttypes.h 巨集確保跨平台打印正確-Woverflow -Wconversion 捕獲隱式截斷