核心對照表
| Java 類型 | 位數 | 字節 | C/C++ 對應類型 (32/64位) | 範圍 / 說明 |
boolean | ~1 | 1 (JVM 實現相關) | bool / _Bool | true/false,非數值類型 |
byte | 8 | 1 | signed char / int8_t | -128 ~ 127 |
short | 16 | 2 | short / int16_t | -32,768 ~ 32,767 |
char | 16 | 2 | wchar_t / char16_t | Unicode 字符 \\u0000 ~ \\uFFFF |
int | 32 | 4 | int / int32_t | -2³¹ ~ 2³¹-1 |
float | 32 | 4 | float | IEEE 754 單精度 |
long | 64 | 8 | long long / int64_t | -2⁶³ ~ 2⁶³-1 |
double | 64 | 8 | double | IEEE 754 雙精度 |
關鍵差異深度解析
1. 固定長度 vs 平台相關
- Java:語言規範強制固定長度(
int 永遠 32 位),實現「一次編寫,到處運行」
- C/C++:
int、long 長度隨編譯器/架構變化(LP64 / ILP64 / LLP64 模型),需使用 stdint.h 固定寬度類型(int32_t 等)保證可移植性
2. 字符類型本質不同
- Java char:無符號 16 位 Unicode 代碼單元(UTF-16),範圍 0~65535
- C/C++ char:有符號/無符號由實現定義,通常 8 位存 ASCII/UTF-8 字節
- C/C++ wchar_t:Windows 16 位,Linux 32 位,不可移植
3. boolean 真假表示
- Java:獨立類型,只能
true/false,不可與數值互換
- C/C++:
0 為假,非 0 為真;C99 _Bool、C++ bool 仍可隱式轉換為整數
4. 浮點數嚴格性
- Java:
strictfp 關鍵字強制 IEEE 754 模式,跨平台結果位級一致
- C/C++:允許使用擴展精度暫存器(x87 80 位),結果可能因優化等級不同而異
JNI 開發實戰對照
| Java 類型 | JNI 類型 | JNI 簽名 | C/C++ 推薦類型 |
| boolean | jboolean | Z | uint8_t / bool |
| byte | jbyte | B | int8_t |
| char | jchar | C | uint16_t / char16_t |
| short | jshort | S | int16_t |
| int | jint | I | int32_t |
| long | jlong | J | int64_t |
| float | jfloat | F | float |
| double | jdouble | D | double |
| Object | jobject | Lcls; | jobject |
| String | jstring | Ljava/lang/String; | jstring |
| int[] | jintArray | [I | jintArray |
序列化/網絡傳輸注意事項
- 位序:Java 統一大端序;C/C++ 需手動
htonl/ntohl 或使用 ByteBuffer.order(ByteOrder.BIG_ENDIAN)
- 結構體對齊:C/C++ 結構體有填充字節,Java 類無此概念,跨語言傳輸需顯式定義協議
- 字符串編碼:Java 內部 UTF-16,網絡傳輸建議統一 UTF-8,C/C++ 端用
iconv / ICU 轉換
總結
理解 Java 與 C/C++ 數據類型的異同,是JNI 開發、跨語言 RPC、嵌入式協議對接、高性能序列化庫設計的基石。牢記「Java 固定、C 變化;Java 字符 16 位、C 字節 8 位;序列化必須顯式約定位序與對齊」三大原則,可避免 90% 的跨語言數據交互坑。