Đó là vấn đề về cách lưu trữ dữ liệu. Sự tương tác của bạn với Sam sẽ làm cho một so sánh tốt hơn nếu bạn hỏi để bạn có thể viết nó xuống nhưng chỉ có giấy có giá trị tám ký tự.
"Sam, cho tôi số điện thoại."
"5555555555"
"Ồ không, tôi hết giấy. Nếu tôi biết trước được bao nhiêu dữ liệu tôi yêu cầu thì tôi có thể chuẩn bị tốt hơn!"
Vì vậy, thay vào đó, hầu hết các ngôn ngữ làm cho bạn khai báo một loại, vì vậy nó sẽ biết và chuẩn bị trước thời hạn:
"Sam, số điện thoại là bao lâu?"
"Mười nhân vật."
"Ok, sau đó hãy để tôi lấy một tờ giấy lớn hơn. Bây giờ hãy đưa cho tôi số điện thoại."
"5555555555"
"Hiểu rồi! Cảm ơn Sam!"
Nó thậm chí còn hairier khi bạn nhìn vào những cách cơ bản thực tế mà dữ liệu được lưu trữ. Nếu bạn giống tôi, bạn có một cuốn sổ ghi chú linh tinh, những con số được viết nguệch ngoạc, không có ngữ cảnh hay ghi nhãn cho bất cứ điều gì và bạn không biết bất kỳ ý nghĩa nào trong ba ngày sau đó. Đây là một vấn đề cho máy tính rất nhiều lần, quá. Rất nhiều ngôn ngữ có loại "int" (int, long, short, byte) và "float" (float, double). Tại sao điều đó là cần thiết?
Đầu tiên, hãy xem cách một số nguyên được lưu trữ và thường được biểu diễn trong máy tính. Bạn có thể biết rằng ở cấp độ cơ bản, tất cả đều là nhị phân (1 và 0). Nhị phân thực sự là một hệ thống số hoạt động chính xác như hệ thống số thập phân của chúng tôi. Trong phần thập phân, bạn đếm từ 0 đến 9 (với các số 0 đứng đầu vô hạn mà bạn không viết), sau đó bạn quay lại 0 và tăng chữ số tiếp theo để bạn có 10. Bạn lặp lại cho đến khi bạn cuộn từ 19 đến 20, lặp lại cho đến khi bạn cuộn từ 99 đến 100, và cứ thế.
Nhị phân không khác nhau, ngoại trừ thay vì 0 đến 9, bạn đếm 0 đến 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000. Vì vậy, khi bạn nhập 9, trong bộ nhớ được ghi ở dạng nhị phân là 1001. Đây là một con số thực tế. Nó có thể được thêm, trừ, nhân, v.v., dưới dạng chính xác. 10 + 1 = 11. 10 + 10 = 100 (cuộn từ 1 đến 0 và mang theo 1). 11 x 10 = 110 (và tương đương, 11 + 11 = 110).
Bây giờ trong bộ nhớ thực (bao gồm các thanh ghi), có một danh sách, mảng, bất cứ thứ gì bạn muốn gọi nó, của các bit (tiềm năng 1 hoặc 0 ') ngay cạnh nhau, đó là cách nó giữ các bit này được tổ chức hợp lý để tạo ra một số lớn hơn 1. Vấn đề là, bạn sẽ làm gì với số thập phân? Bạn không thể chỉ chèn một phần cứng vào giữa hai bit trong thanh ghi và sẽ tốn quá nhiều chi phí để thêm "bit thập phân" vào giữa mỗi cặp bit. Vậy lam gi?
Bạn mã hóa nó. Nói chung, kiến trúc của CPU hoặc phần mềm sẽ xác định cách thực hiện, nhưng một cách phổ biến là lưu trữ một dấu (+ hoặc -, nói chung là 1 âm) trong bit đầu tiên của thanh ghi, một mantissa (số của bạn đã thay đổi tuy nhiên nhiều lần cần phải loại bỏ số thập phân) cho số bit X sau đây và số mũ (số lần bạn phải thay đổi nó) cho phần còn lại. Nó tương tự như ký hiệu khoa học.
Gõ cho phép trình biên dịch biết những gì nó đang nhìn. Hãy tưởng tượng rằng bạn đã lưu trữ giá trị 1.3 trong thanh ghi 1. Chúng ta sẽ đưa ra sơ đồ mã hóa ưa thích của riêng mình ở đây, 1 bit cho ký hiệu, 4 cho mantissa, 3 cho số mũ (1 bit cho ký hiệu, 2 cho cường độ). Đây là một số dương, vì vậy dấu là dương (0). Mantissa của chúng tôi sẽ là 13 (1101) và số mũ của chúng tôi sẽ là -1 (101 (1 cho âm, 01 = 1)). Vì vậy, chúng tôi lưu trữ 01101101 trong đăng ký 1. Bây giờ chúng tôi đã không nhập biến này, vì vậy khi thời gian chạy sử dụng nó, nó nói "chắc chắn, đây là số nguyên tại sao không" vì vậy khi in giá trị chúng tôi thấy 109 (64 + 32 + 8 + 4 + 1), điều này rõ ràng là không đúng.
Tuy nhiên, không phải ngôn ngữ nào cũng yêu cầu bạn gõ một cách rõ ràng. C # có từ khóa "var" khiến loại biến được giải thích tại thời điểm biên dịch và các ngôn ngữ khác như Javascript được nhập hoàn toàn tự động, đến mức bạn có thể lưu trữ một số nguyên trong một biến, sau đó gán nó cho boolean, sau đó gán nó cho boolean gán lại cho một chuỗi và ngôn ngữ theo dõi tất cả.
Nhưng trình biên dịch, trình thông dịch hoặc thời gian chạy dễ dàng hơn nhiều - và thường dẫn đến một chương trình nhanh hơn vì nó không phải tiêu tốn tài nguyên có giá trị sắp xếp thông qua việc gõ mọi thứ - để hỏi bạn, lập trình viên, loại nào dữ liệu bạn đang cung cấp cho nó.