0xFFFFFFFFL 是一个编程中常见的十六进制长整型(long)字面量。
核心含义
- 数值大小:十进制为 4,294,967,295 (232−12^{32} - 1232−1)。
- 二进制表示:32个1,即
11111111 11111111 11111111 11111111。 - 后缀 L:表示该数值的数据类型为 Long(长整型,通常为64位),而非默认的 Int(整型,通常为32位)。
为什么需要加 "L"?
在 Java、C#等强类型语言中,如果不加后缀,0xFFFFFFFF 会被默认解析为 int 类型。由于 int 是有符号的32位整数,最高位为符号位,全1的二进制补码表示 -1。
加上 L 后,编译器将其视为 long 类型。long 是64位有符号整数,0xFFFFFFFFL 的高32位自动补0,低32位为全1。因此,它被正确解释为一个巨大的正数,而不是负数。
常见应用场景
主要用于将有符号的32位整数转换为无符号的64位长整数,以保留其原始位模式代表的正值。
例如在 Java 中读取网络字节流或文件中的无符号32位整数时:
java
// 假设 bf.getInt() 返回一个 int,其二进制为 0xFFFFFFFF (-1)
int signedValue = bf.getInt();
// 错误做法:直接赋值,结果仍为 -1
long wrong = signedValue;
// 正确做法:与 0xFFFFFFFFL 进行按位与 (&) 操作
// 这将把 int 提升为 long,并屏蔽掉高32位的符号扩展,只保留低32位
long unsignedValue = signedValue & 0xFFFFFFFFL;
// 此时 unsignedValue 的值为 4294967295
总结对比
| 写法 | 数据类型 | 十进制值 | 说明 |
|---|---|---|---|
0xFFFFFFFF |
int (32位) |
-1 | 有符号整数,全1为补码-1 |
0xFFFFFFFFL |
long (64位) |
4,294,967,295 | 长整数,高32位为0,低32位为全1 |