Tại sao các số thập lục phân có tiền tố là 0x
? Tôi hiểu cách sử dụng tiền tố nhưng tôi không hiểu tầm quan trọng của lý do tại sao 0x
được chọn.
Tại sao các số thập lục phân có tiền tố là 0x
? Tôi hiểu cách sử dụng tiền tố nhưng tôi không hiểu tầm quan trọng của lý do tại sao 0x
được chọn.
Câu trả lời:
Truyện ngắn: Người 0
kể cho trình phân tích cú pháp nó xử lý một hằng số (và không phải là từ định danh / từ dành riêng). Một cái gì đó vẫn cần thiết để xác định cơ sở số: đó x
là một lựa chọn tùy ý.
Câu chuyện dài: Trong thập niên 60, các hệ thống số lập trình phổ biến là thập phân và bát phân - các khung hình chính có 12, 24 hoặc 36 bit trên mỗi byte, chia hết cho 3 = log2 (8).
Ngôn ngữ BCPL đã sử dụng cú pháp 8 1234
cho các số bát phân. Khi Ken Thompson tạo B từ BCPL, anh ta đã sử dụng 0
tiền tố thay thế. Điều này thật tuyệt vì
0
giống nhau trong cả hai cơ sở),00005 == 05
) và#123
).Khi C được tạo từ B, nhu cầu về số thập lục phân nảy sinh (PDP-11 có các từ 16 bit) và tất cả các điểm trên vẫn còn hiệu lực. Vì các quãng tám vẫn cần thiết cho các máy khác, 0x
được chọn tùy ý ( 00
có thể bị loại trừ vì khó xử).
C # là hậu duệ của C, vì vậy nó kế thừa cú pháp.
0x
qua 00
là sở thích / lúng túng. 00
sẽ phá vỡ mã hiện có. 0010
như bát phân là 8
, trong khi 0010
như thập lục phân sẽ là 16
. Họ không thể sử dụng bất kỳ số nào làm chỉ báo chữ số thứ hai (ngoại trừ 8
hoặc 9
không giữ bất kỳ ý nghĩa nào liên quan đến thập lục phân) vì vậy một chữ cái là bắt buộc. Và điều đó để lại 0h
hoặc 0x
( H e X idecimal). Từ thời điểm này, có vẻ như nó thực sự trở lại ưu tiên.
0
tiền tố cho bát phân đã gây ra rất nhiều vấn đề trong những năm qua. Đáng chú ý là ở các quốc gia như Vương quốc Anh nơi số điện thoại bắt đầu bằng a 0
. Javascript và nhiều ngôn ngữ khác sẽ phân tích các ngôn ngữ này dưới dạng bát phân, xáo trộn số trước khi lưu trữ. Để thêm phần thú vị, một sản phẩm cơ sở dữ liệu phổ biến sẽ âm thầm chuyển trở lại phân tích cú pháp thập phân nếu số đó chứa một 8
hoặc 9
.
Lưu ý: Tôi không biết câu trả lời chính xác, nhưng dưới đây chỉ là suy đoán cá nhân của tôi!
Như đã đề cập 0 trước một số có nghĩa là số bát phân:
04524 // octal, leading 0
Hãy tưởng tượng bạn cần phải đưa ra một hệ thống để biểu thị các số thập lục phân và lưu ý rằng chúng ta đang làm việc trong môi trường kiểu C. Làm thế nào về kết thúc với h như lắp ráp? Thật không may, bạn không thể - nó sẽ cho phép bạn tạo mã thông báo là số nhận dạng hợp lệ (ví dụ: bạn có thể đặt tên cho một biến giống nhau) sẽ tạo ra một số sự mơ hồ khó chịu.
8000h // hex
FF00h // oops - valid identifier! Hex or a variable or type named FF00h?
Bạn không thể lãnh đạo với một nhân vật vì lý do tương tự:
xFF00 // also valid identifier
Sử dụng hàm băm có thể bị loại bỏ vì nó xung đột với bộ tiền xử lý:
#define ...
#FF00 // invalid preprocessor token?
Cuối cùng, vì bất kỳ lý do gì, họ đã quyết định đặt dấu x sau số 0 đứng đầu để biểu thị thập lục phân. Không rõ ràng vì nó vẫn bắt đầu bằng một ký tự số nên không thể là định danh hợp lệ và có thể dựa trên quy ước bát phân của số 0 đứng đầu.
0xFF00 // definitely not an identifier!
0xFFAB1234
phải được viết là 0FFAB1234h
. Tôi nhớ nó từ asm nội tuyến trong Pascal khi tôi còn trẻ stackoverflow.com/q/11733731/995714
Đó là một tiền tố để chỉ ra số ở dạng thập lục phân chứ không phải trong một số cơ sở khác. Ngôn ngữ lập trình C sử dụng nó để báo cho trình biên dịch.
Thí dụ:
0x6400
dịch sang 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
Khi trình biên dịch đọc 0x6400
, Nó hiểu số là thập lục phân với sự trợ giúp của thuật ngữ 0x . Thông thường chúng ta có thể hiểu theo (6400) 16 hoặc (6400) 8 hoặc bất cứ điều gì ..
Đối với nhị phân, nó sẽ là:
0b00000001
Hy vọng tôi đã giúp một cách nào đó.
Ngày tốt!
x6400
? Các x
vẫn có thể được sử dụng để suy ra hệ thập lục phân.
Số 0 trước được sử dụng để chỉ ra một số trong cơ sở 2, 8 hoặc 16.
Theo tôi, 0x được chọn để biểu thị hex vì 'x' nghe giống như hex.
Chỉ là ý kiến của tôi, nhưng tôi nghĩ nó có ý nghĩa.
Ngày tốt!