仓颉语言入门 —— 基本数据类型(一)

Posted by     "xtcel" on Monday, July 8, 2024

仓颉语言入门 —— 基本数据类型(一)

在编程语言中,数据类型是一个至关重要的概念,它决定了变量能够存储什么样的数据以及可以对这些数据进行哪些操作。今天,我们将介绍仓颉语言中的数字类型:整型(integer)和浮点型(float)。

整型(Integer)

整型是最基本的数值类型之一,用于表示没有小数部分的整数。在仓颉语言中,整数类型分为有符号整数类型和无符号整数类型,整型数可以是正数、负数或零。例如:

let a: Int8 = 42;
let b: Int8 = -7;
let c: UInt8 = 0;

在这个例子中,我们声明了三个整型变量 abc,它们分别赋值为正整数、负整数和零。

范围大小

每种数据类型都有其适用的范围大小,如果超出其范围程序就会报错。 无符号整数类型包括 UInt8、UInt16、UInt32、UInt64 和 UIntNative,分别用于表示编码长度为 8-bit、16-bit、32-bit、64-bit 和平台相关大小的无符号整数值的类型。 8位无符号整型 UInt8 在内存中分布如下所示: 每个 bit 可以是 0 或 1,其可表示范围为:$0 ~ 2^8 -1$(0 ~ 255);以此类推,对于编码长度为 N 的无符号整数类型,其表示范围为:$0 ~ 2^N -1$。 下表列出了所有无符号整数类型的表示范围:

类型表示范围
Int8$0 ~ 2^8 -1$(0 ~ 255)
Int16$0 ~ 2^{16} -1$(0 ~ 65535)
Int32$0 ~ 2^{32} - 1$(0 ~ 4,294,967,295)
Int64$0 ~ 2^{64} -1$(0 ~ 18,446,744,073,709,551,615)
IntNativeplatform dependent

有符号整数类型包括 Int8、Int16、Int32、Int64 和 IntNative,分别用于表示编码长度为 8-bit、16-bit、32-bit、64-bit 和平台相关大小的有符号整数值的类型。 为了编码负号,需要额外分配一个符号位来表示数值的正负。设置这个位为 0 时表示正数,为 1 时表示负数。对于编码长度为 N 的有符号整数类型,其表示范围为:$-2^{N-1} ~ 2^{N-1} -1$。 程序具体使用哪种整数类型,取决于该程序中需要处理的整数的性质和范围。在 Int64 类型适合的情况下,首选 Int64 类型,因为 Int64 的表示范围足够大,并且整数类型字面量在没有类型上下文的情况下默认推断为 Int64 类型,可以避免不必要的类型转换。

基础用法

整数类型默认支持的操作符包括:算术操作符、位操作符、关系操作符、自增和自减操作符、赋值操作符、复合赋值操作符。

  1. 算术运算:整型变量可以进行各种算术运算,包括一元负号(-)、加法(+)、减法(-)、乘法(*)、除法(/)、取模(%)、幂运算(**)。
  • 除了一元负号(-)和幂运算(**),其他操作符要求左右操作数是相同的类型。
  • *,/,+ 和 - 的操作数可以是整数类型或浮点类型。
  • % 的操作数只支持整数类型。
  • ** 的左操作数只能为 Int64 类型或 Float64 类型,并且:
    • 当左操作数类型为 Int64 时,右操作数只能为 UInt64 类型,表达式的类型为 Int64。
    • 当左操作数类型为 Float64 时,右操作数只能为 Int64 类型或 Float64 类型,表达式的类型为 Float64。
let sum = a + b; // 35
let difference = a - b; // 49
let product = a * b; // -294
let quotient = a / b; // -6 (整数除法结果)
let p1 = 2 ** 3               // p1 = 8
let p2 = 2 ** UInt64(3 ** 2)  // p2 = 512
  1. 比较运算:整型变量也可以进行比较运算,如等于、不等于、大于和小于。
let isEqual = (a == 42); // true
let isNotEqual = (b != -7); // false
let isGreater = (a > b); // true
let isLess = (b < c); // true
  1. 位操作符包括:按位求反(!)、左移(«)、右移(»)、按位与(&)、按位异或(^)、按位或(|)。注意,按位与、按位异或和按位或操作符要求左右操作数是相同的整数类型。
  2. 自增和自减操作符包括:自增(++)和自减(–)。注意,仓颉中的自增和自减操作符只能作为一元后缀操作符使用。
  3. 赋值操作符即 =,复合赋值操作符包括:+=、-=、*=、/=、%=、**=、«=、»=、&=、^=、|=。

整数类型字面量

整数类型字面量有 4 种进制表示形式:二进制(使用 0b 或 0B 前缀)、八进制(使用 0o 或 0O 前缀)、十进制(没有前缀)、十六进制(使用 0x 或 0X 前缀)。例如,对于十进制数 24,表示成二进制是 0b00011000(或 0B00011000),表示成八进制是 0o30(或 0O30),表示成十六进制是 0x18(或 0X18)。 在各进制表示中,可以使用下划线 _ 充当分隔符的作用,方便识别数值的位数,如 0b0001_1000。 对于整数类型字面量,如果它的值超出了上下文要求的整数类型的表示范围,编译器将会报错。

let x: Int8 = 128          // Error, 128 out of the range of Int8
let y: UInt8 = 256         // Error, 256 out of the range of UInt8
let z: Int32 = 0x8000_0000 // Error, 0x8000_0000 out of the range of Int32

在使用整数类型字面量时,可以通过加入后缀来明确整数字面量的类型,后缀与类型的对应为:

后缀类型后缀类型
i8Int8u8UInt8
i16Int16u16UInt16
i32Int32u32UInt32
i64Int64u64UInt64

加入了后缀的整数字面量可以像下面的方式来使用:

var x = 100i8  // x is 100 with type Int8
var y = 0x10u64 // y is 16 with type UInt64
var z = 0o432i32  // z is 282 with type Int32

浮点型(Float)

浮点型用于表示带有小数部分的数值。在仓颉语言中,浮点类型包括 Float16、 Float32 和 Float64,分别用于表示编码长度为 16-bit、 32-bit 和 64-bit 的浮点数(带小数部分的数字,如 3.14159、8.24 和 0.1 等)的类型。Float16、 Float32 和 Float64 分别对应 IEEE 754 中的半精度格式(即 binary16)、单精度格式(即 binary32)和双精度格式(即 binary64)。 示例:

let x = 3.14;
let y = -0.001;
let z = 0.0;

在这个例子中,我们声明了三个浮点型变量 xyz,它们分别赋值为正浮点数、负浮点数和零。

基础用法

浮点类型默认支持的操作符包括:算术操作符、关系操作符、赋值操作符、复合赋值操作符。浮点类型不支持自增和自减操作符。

  1. 算术运算:浮点型变量可以进行各种算术运算,与整型类似,但结果是浮点数。
let sum = x + y; // 3.139
let difference = x - y; // 3.141
let product = x * y; // -0.00314
let quotient = x / y; // -3140.0
  1. 比较运算:浮点型变量也可以进行比较运算,如等于、不等于、大于和小于。
let isEqual = (x == 3.14); // true
let isNotEqual = (y != -0.001); // false
let isGreater = (x > y); // true
let isLess = (y < z); // true
  1. 精度问题:需要注意的是,浮点型运算可能会遇到精度问题。

这种情况是由于浮点数在计算机中以二进制形式存储时,某些小数无法精确表示所导致的。在处理金融或其他对精度要求较高的计算时,可能需要额外的处理措施。 Float64 的精度约为小数点后 15 位,Float32 的精度约为小数点后 6 位,Float16 的精度约为小数点后 3 位。使用哪种浮点类型,取决于代码中需要处理的浮点数的性质和范围。在多种浮点类型都适合的情况下,首选精度高的浮点类型,因为精度低的浮点类型的累计计算误差很容易扩散,并且它能精确表示的整数范围也很有限。

浮点类型字面量

浮点类型字面量有两种进制表示形式:十进制、十六进制。在十进制表示中,一个浮点字面量至少要包含一个整数部分或一个小数部分,没有小数部分时必须包含指数部分(以 e 或 E 为前缀,底数为 10)。在十六进制表示中,一个浮点字面量除了至少要包含一个整数部分或小数部分(以 0x 或 0X 为前缀),同时必须包含指数部分(以 p 或 P 为前缀,底数为 2)。 下面的例子展示了浮点字面量的使用:

let a: Float32 = 3.14
let b: Float32 = 2e3
let c: Float32 = 2.4e-1
let d: Float64 = .123e2
let e: Float64 = 0x1.1p0
let f: Float64 = 0x1p2
let g: Float64 = 0x.2p4

在使用十进制浮点数字面量时,可以通过加入后缀来明确浮点数字面量的类型,后缀与类型的对应为:

后缀类型
f16Float16
f32Float32
f64Float64

加入了后缀的浮点数字面量可以像下面的方式来使用:

let a = 3.14f32   // a is 3.14 with type Float32
let b = 2e3f32    // b is 2e3 with type Float32
let c = 2.4e-1f64 // c is 2.4e-1 with type Float64
let d = .123e2f64 // d is .123e2 with type Float64

总结

在本篇文章中,我们介绍了仓颉语言中的数字类型,包括整型和浮点型的基本概念和用法。整型用于表示没有小数部分的整数,浮点型用于表示带有小数部分的数值。理解并正确使用这些基本数据类型,是编写高效、准确代码的基础。 在下一篇文章中,我们将继续探索仓颉语言的其他基本数据类型,敬请期待!