2012-02-19 31 views
14

Tại sao một ký tự trong Java mất gấp đôi không gian để lưu trữ dưới dạng ký tự trong C?Kích thước ký tự trong Java so với C

+4

Người ta có thể phản đối hỏi câu hỏi, làm sao bạn biết đủ rằng chúng khác nhau nhưng không đi đến bước tiếp theo và tìm ra lý do tại sao? –

+10

Java mạnh gấp đôi C++, và sức mạnh phải đến từ đâu đó ... –

+0

@KerrekSB Nhưng nó có thể có 256 x nhiều ký tự. ;) –

Trả lời

26

Trong các ký tự Java là 16-bit và C, chúng là 8 bit.

Câu hỏi tổng quát hơn là tại sao lại như vậy?

Để tìm hiểu lý do bạn cần xem lịch sử và đi đến kết luận/ý kiến ​​ về chủ đề này.

Khi C được phát triển ở Mỹ, ASCII khá chuẩn và bạn chỉ thực sự cần 7 bit, nhưng với 8 bạn cũng có thể xử lý một số ký tự không phải ASCII. Nó có vẻ là quá đủ. Nhiều giao thức dựa trên văn bản như SMTP (email), XML và FIX, vẫn chỉ sử dụng ký tự ASCII. Email và XML mã hóa các ký tự không phải ASCII. Các tệp nhị phân, ổ cắm và luồng vẫn chỉ có 8 bit byte gốc.

BTW: C có thể hỗ trợ nhân vật rộng hơn, nhưng đó không phải là đơn giản char

Khi Java được phát triển 16-bit có vẻ như đủ để hỗ trợ hầu hết ngôn ngữ. Kể từ đó unicode đã được mở rộng đến các ký tự trên 65535 và Java đã phải thêm hỗ trợ cho codepoints là ký tự UTF-16 và có thể là một hoặc hai ký tự 16 bit.

Vì vậy, hãy tạo byte một byte và char giá trị 16 bit chưa ký có ý nghĩa tại thời điểm đó.

BTW: Nếu JVM của bạn hỗ trợ -XX:+UseCompressedStrings, nó có thể sử dụng byte thay vì ký tự cho chuỗi chỉ sử dụng ký tự 8 bit.

+0

Bây giờ thì giống như vậy :) +1 –

+0

Xem thêm @

+4

Để chính xác, trong C chúng * ít nhất * 8 bit. –

0

Java char là một mã mã UTF-16 mã hóa unicode trong khi C sử dụng mã hóa ascii trong hầu hết các trường hợp.

+4

Tiêu chuẩn C không ủy nhiệm ASCII. –

+1

Ngoài ra, char Java không phải là "char unicode". –

+2

Phải, đó là đơn vị mã UTF-16. –

2

Vì Java sử dụng Unicode, C thường sử dụng ASCII theo mặc định.

Có nhiều hương vị mã hóa Unicode, nhưng Java sử dụng UTF-16, sử dụng một hoặc hai đơn vị mã 16 bit cho mỗi ký tự. ASCII luôn sử dụng một byte cho mỗi ký tự.

+3

UTF-16 không "sử dụng hai byte cho mỗi char". –

+0

Xin lỗi, "ít nhất" hai byte cho mỗi ký tự. – DNA

1

Java là một ngôn ngữ hiện đại để nó hỗ trợ Unicode theo mặc định, giống như nhiều ngôn ngữ mới hôm nay (chẳng hạn như C#). Ngược lại C là một ngôn ngữ "cổ đại" từ thời đại của ASCII 7-bit, do đó nó sử dụng char 8 bit theo mặc định.Khi đến với thời gian Unicode, để không thực hiện ngắt mã cũ, họ quyết định sử dụng một loại ký tự khác là wchar_t

Các vấn đề liên quan