Khái niệm
Hệ thống kiểu dữ liệu xác định dữ liệu nào được lưu trữ, phép toán nào hợp lệ và cách chương trình kiểm tra sự tương thích giữa các giá trị. Đây là nền tảng để giảm lỗi và mô tả ý nghĩa của dữ liệu rõ ràng hơn.
Các kiểu dữ liệu cơ bản
Mọi ngôn ngữ lập trình đều có một bộ kiểu dữ liệu nguyên thủy để biểu diễn dữ liệu đơn giản nhất:
| Loại | Dùng cho | Ví dụ |
|---|---|---|
| Số nguyên | Đếm, chỉ số, vòng lặp | 42, -7, 0 |
| Số thực | Đo lường, tính toán tỉ lệ | 3.14, -0.5 |
| Boolean | Đúng/sai, bật/tắt | true, false |
| Chuỗi | Văn bản, tên, thông báo | "xin chao" |
Tên gọi và cách dùng của từng kiểu này khác nhau đôi chút tùy ngôn ngữ, nhưng ý nghĩa cốt lõi đều giống nhau.
Ví dụ khai báo dữ liệu
count = 10
name = "Lan"
price = 12.5
var
count: Integer;
name: String;
price: Real;
int count = 10;
char name[] = "Lan";
double price = 12.5;
int count = 10;
std::string name = "Lan";
double price = 12.5;
int count = 10;
string name = "Lan";
double price = 12.5;
let count = 10;
let name = "Lan";
let price = 12.5;
let count: number = 10;
let name: string = "Lan";
let price: number = 12.5;
count := 10
name := "Lan"
price := 12.5
let count: i32 = 10;
let name: &str = "Lan";
let price: f64 = 12.5;
Chuyển đổi kiểu
Khi nhập dữ liệu từ người dùng, kết quả thường là chuỗi ký tự. Để tính toán, cần chuyển đổi sang số. Đây là thao tác rất phổ biến trong thực tế.
text = "42"
number = int(text) # chuỗi → số nguyên
price = float("12.5") # chuỗi → số thực
back = str(number) # số → chuỗi
print(number + 1) # 43
program ConversionDemo;
var
text: String;
number: Integer;
begin
text := '42';
number := StrToInt(text); { chuỗi → số nguyên }
Writeln(number + 1); { 43 }
text := IntToStr(number); { số → chuỗi }
Writeln(text); { '42' }
end.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char text[] = "42";
int number = atoi(text); /* chuỗi → số nguyên */
printf("%d\n", number + 1); /* 43 */
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main() {
string text = "42";
int number = stoi(text); // chuỗi → số nguyên
cout << number + 1 << endl; // 43
string back = to_string(number); // số → chuỗi
cout << back << endl; // "42"
return 0;
}
string text = "42";
int number = int.Parse(text); // chuỗi → số nguyên
Console.WriteLine(number + 1); // 43
string back = number.ToString(); // số → chuỗi
Console.WriteLine(back); // "42"
const text = "42";
const number = parseInt(text); // chuỗi → số nguyên
console.log(number + 1); // 43
const price = parseFloat("12.5"); // chuỗi → số thực
const back = String(number); // số → chuỗi
console.log(back); // "42"
const text: string = "42";
const number: number = parseInt(text); // chuỗi → số nguyên
console.log(number + 1); // 43
const back: string = String(number); // số → chuỗi
console.log(back); // "42"
package main
import (
"fmt"
"strconv"
)
func main() {
text := "42"
number, _ := strconv.Atoi(text) // chuỗi → số nguyên
fmt.Println(number + 1) // 43
back := strconv.Itoa(number) // số → chuỗi
fmt.Println(back) // "42"
}
fn main() {
let text = "42";
let number: i32 = text.parse().unwrap(); // chuỗi → số nguyên
println!("{}", number + 1); // 43
let back = number.to_string(); // số → chuỗi
println!("{}", back); // "42"
}
Hai góc nhìn quan trọng
- Kiểm tra kiểu ở thời điểm viết hoặc biên dịch giúp phát hiện lỗi sớm.
- Kiểm tra kiểu ở thời điểm chạy giúp mã linh hoạt hơn nhưng đòi hỏi người viết cẩn thận hơn.
Ghi chú theo ngôn ngữ
Python là ngôn ngữ kiểm tra kiểu động. Biến không cần khai báo kiểu trước, nhưng phép toán không hợp lệ vẫn bị từ chối khi chương trình chạy.
Pascal dùng kiểu tĩnh, vì vậy phần lớn sai lệch kiểu sẽ được phát hiện sớm. Cách làm này phù hợp với các bài toán cần cấu trúc rõ ràng.
C cũng dùng kiểu tĩnh, nhưng cho phép một số phép chuyển đổi kiểu ngầm định. Vì vậy người học cần chú ý hơn đến phạm vi giá trị và phép ép kiểu.
C++ mở rộng hệ thống kiểu của C với các kiểu của lập trình hướng đối tượng. auto giúp suy luận kiểu tự động, còn const bảo vệ giá trị không bị thay đổi.
C# là ngôn ngữ kiểu tĩnh mạnh với cú pháp khai báo kiểu rõ ràng. var cho phép suy luận kiểu tự động nhưng kiểu vẫn cố định sau khi khởi tạo.
JavaScript là ngôn ngữ kiểu động: biến có thể đổi kiểu trong quá trình chạy. Điều này linh hoạt nhưng dễ gây lỗi ngầm nếu không kiểm soát kỹ.
TypeScript bổ sung hệ thống kiểu tĩnh lên trên JavaScript. Kiểu được kiểm tra tại thời điểm biên dịch — giúp phát hiện sới kỳ sớm mà vẫn giữ được sự linh hoạt của JS.
Go là ngôn ngữ kiểu tĩnh mạnh. Kiểu có thể được suy luận tự động với :=, nhưng không có chuyển đổi kiểu ngầm định giữa các kiểu cơ bản.
Rust có hệ thống kiểu tĩnh cưỡng bước mạnh mẽ, kết hợp với bộ kiểm tra quyền sở hữu (ownership). Kiểu có thể được suy luận tự động trong hầu hết các trường hợp.
Bình luận