Carbon基本类型 #
一、类型系统概述 #
Carbon是静态类型语言,每个变量和表达式都有确定的类型。类型系统确保类型安全,防止类型错误。
二、整数类型 #
2.1 有符号整数 #
| 类型 | 大小 | 范围 |
|---|---|---|
i8 |
8位 | -128 到 127 |
i16 |
16位 | -32768 到 32767 |
i32 |
32位 | -2147483648 到 2147483647 |
i64 |
64位 | 约 ±9.2 × 10^18 |
i128 |
128位 | 更大范围 |
iN |
N位 | 自定义宽度 |
carbon
var small: i8 = 100;
var medium: i16 = 30000;
var standard: i32 = 2000000000;
var large: i64 = 9000000000000000000;
2.2 无符号整数 #
| 类型 | 大小 | 范围 |
|---|---|---|
u8 |
8位 | 0 到 255 |
u16 |
16位 | 0 到 65535 |
u32 |
32位 | 0 到 4294967295 |
u64 |
64位 | 0 到 约1.8 × 10^19 |
u128 |
128位 | 更大范围 |
uN |
N位 | 自定义宽度 |
carbon
var byte: u8 = 255;
var word: u16 = 65535;
var dword: u32 = 4000000000;
var qword: u64 = 18000000000000000000;
2.3 整数字面量 #
carbon
// 十进制
var dec: i32 = 42;
// 十六进制
var hex: i32 = 0x2A; // 42
// 二进制
var bin: i32 = 0b101010; // 42
// 八进制
var oct: i32 = 0o52; // 42
// 分隔符(提高可读性)
var big: i32 = 1_000_000;
2.4 整数运算 #
carbon
var a: i32 = 10;
var b: i32 = 3;
var sum: i32 = a + b; // 13
var diff: i32 = a - b; // 7
var product: i32 = a * b; // 30
var quotient: i32 = a / b; // 3 (整数除法)
var remainder: i32 = a % b; // 1
// 注意:整数除法会截断
var result: i32 = 7 / 2; // 3
2.5 溢出处理 #
carbon
// 检测溢出
var x: u8 = 255;
// x = x + 1; // 可能溢出
// 安全运算
var safe_result: Optional(u8) = x.CheckedAdd(1);
if (safe_result.HasValue()) {
Print("结果: {0}", safe_result.Value());
} else {
Print("溢出!");
}
三、浮点类型 #
3.1 浮点类型 #
| 类型 | 大小 | 精度 | 范围 |
|---|---|---|---|
f16 |
16位 | 半精度 | 约 ±65504 |
f32 |
32位 | 单精度 | 约 ±3.4 × 10^38 |
f64 |
64位 | 双精度 | 约 ±1.8 × 10^308 |
carbon
var half: f16 = 3.14;
var single: f32 = 3.14159;
var double: f64 = 3.14159265358979;
3.2 浮点字面量 #
carbon
// 小数形式
var a: f64 = 3.14;
// 科学计数法
var b: f64 = 1.5e10; // 15000000000
var c: f64 = 1.5e-3; // 0.0015
// 分隔符
var d: f64 = 3.141_592_653;
3.3 浮点运算 #
carbon
var x: f64 = 10.0;
var y: f64 = 3.0;
var sum: f64 = x + y; // 13.0
var diff: f64 = x - y; // 7.0
var product: f64 = x * y; // 30.0
var quotient: f64 = x / y; // 3.333...
// 幂运算
var power: f64 = x.Pow(2); // 100.0
// 平方根
var sqrt_val: f64 = x.Sqrt(); // 3.162...
3.4 特殊值 #
carbon
// 无穷大
var inf: f64 = f64.Infinity;
var neg_inf: f64 = -f64.Infinity;
// 非数字
var nan: f64 = f64.NaN;
// 检查
if (inf.IsInfinite()) {
Print("无穷大");
}
if (nan.IsNaN()) {
Print("非数字");
}
四、类型转换 #
4.1 显式转换 #
carbon
// 整数之间
var i: i32 = 42;
var l: i64 = i64(i);
var u: u32 = u32(i);
// 整数到浮点
var f: f64 = f64(i);
// 浮点到整数(截断)
var d: f64 = 3.7;
var n: i32 = i32(d); // 3
4.2 安全转换 #
carbon
// 检查转换是否安全
var large: i64 = 3000000000;
var small: Optional(u32) = u32.TryFrom(large);
if (small.HasValue()) {
Print("转换成功: {0}", small.Value());
} else {
Print("转换失败:值超出范围");
}
4.3 隐式转换 #
Carbon不支持隐式类型转换:
carbon
var i: i32 = 42;
// var l: i64 = i; // 错误:需要显式转换
var l: i64 = i64(i); // 正确
五、类型推断 #
5.1 自动推断 #
carbon
var x = 42; // i32
var y = 3.14; // f64
var z = 0x100; // i32
var w = 1_000_000; // i32
5.2 类型注解影响 #
carbon
var a: i64 = 42; // i64
var b: f32 = 3.14; // f32
5.3 上下文推断 #
carbon
fn TakesI64(x: i64) -> i64 {
return x;
}
var result = TakesI64(42); // 42被推断为i64
六、类型别名 #
6.1 基本别名 #
carbon
typealias UserID = i64;
typealias Port = u16;
typealias Coordinate = f64;
var id: UserID = 1001;
var port: Port = 8080;
var x: Coordinate = 1.5;
6.2 语义化类型 #
carbon
typealias Seconds = i64;
typealias Milliseconds = i64;
fn Sleep(duration: Seconds) {
// ...
}
Sleep(5); // 清晰表示5秒
七、类型属性 #
7.1 类型大小 #
carbon
Print("i32大小: {0} 字节", i32.Size); // 4
Print("i64大小: {0} 字节", i64.Size); // 8
Print("f64大小: {0} 字节", f64.Size); // 8
7.2 类型范围 #
carbon
Print("i32最小值: {0}", i32.Min); // -2147483648
Print("i32最大值: {0}", i32.Max); // 2147483647
Print("u8最大值: {0}", u8.Max); // 255
7.3 类型检查 #
carbon
var x: i32 = 42;
if (x is i32) {
Print("x是i32类型");
}
八、数值方法 #
8.1 数学方法 #
carbon
var x: f64 = -3.7;
var abs_val: f64 = x.Abs(); // 3.7
var floor_val: f64 = x.Floor(); // -4.0
var ceil_val: f64 = x.Ceil(); // -3.0
var round_val: f64 = x.Round(); // -4.0
8.2 比较方法 #
carbon
var a: f64 = 3.14;
var b: f64 = 3.14159;
Print("最小值: {0}", a.Min(b)); // 3.14
Print("最大值: {0}", a.Max(b)); // 3.14159
8.3 位操作 #
carbon
var x: i32 = 42;
var clz: i32 = x.CountLeadingZeros(); // 前导零
var ctz: i32 = x.CountTrailingZeros(); // 后导零
var pop: i32 = x.PopCount(); // 1的位数
九、最佳实践 #
9.1 选择合适的类型 #
carbon
// 年龄:使用较小的无符号整数
var age: u8 = 25;
// 计数:使用标准整数
var count: i32 = 0;
// 大数据:使用64位整数
var big_data: i64 = 0;
// 科学计算:使用双精度浮点
var measurement: f64 = 3.14159265358979;
9.2 避免溢出 #
carbon
// 使用足够大的类型
var large_count: i64 = 0;
// 检查运算结果
var a: i32 = 2000000000;
var b: i32 = 2000000000;
// var c: i32 = a + b; // 可能溢出
// 使用i64
var c: i64 = i64(a) + i64(b); // 安全
9.3 浮点精度 #
carbon
// 不要直接比较浮点数
var a: f64 = 0.1 + 0.2;
var b: f64 = 0.3;
// if (a == b) { ... } // 可能不成立
// 使用近似比较
if ((a - b).Abs() < 1e-9) {
Print("近似相等");
}
十、总结 #
本章我们学习了:
- 整数类型:有符号和无符号,各种大小
- 浮点类型:f16、f32、f64
- 类型转换:显式转换、安全转换
- 类型推断:自动推断类型
- 类型别名:语义化类型定义
- 类型属性:大小、范围、检查
- 数值方法:数学运算、位操作
接下来让我们学习Carbon的字符串类型!
最后更新:2026-03-27