Con người sử dụng hệ thống số thập phân [cơ số 10] và thập phân [cơ số 12] để đếm và đo lường [có lẽ vì chúng ta có 10 ngón tay và hai ngón chân cái]. Máy tính sử dụng hệ thống số nhị phân [cơ sở 2], vì chúng được tạo từ các thành phần kỹ thuật số nhị phân [được gọi là bóng bán dẫn] hoạt động ở hai trạng thái - bật và tắt. Trong điện toán, chúng ta cũng sử dụng hệ thống số thập lục phân [cơ số 16] hoặc hệ số bát phân [cơ số 8], như một dạng thu gọn để biểu diễn các số nhị phân
Hệ thống số thập phân [cơ số 10]
Hệ thống số thập phân có mười ký hiệu.
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^07,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^08,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^09,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B0,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B1,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B2,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B3, và
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B4, được gọi là các chữ số. Nó sử dụng ký hiệu vị trí. Tức là chữ số có nghĩa nhỏ nhất [chữ số ngoài cùng bên phải] là thứ tự của
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B5 [đơn vị hoặc hàng đơn vị], chữ số ngoài cùng bên phải thứ hai là thứ tự của
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B6 [chục], chữ số thứ ba ngoài cùng bên phải là của . Ví dụ,
735 = 700 + 30 + 5 = 7×10^2 + 3×10^1 + 5×10^0
Chúng tôi sẽ biểu thị một số thập phân có hậu tố tùy chọn
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B9 nếu có sự mơ hồ
Hệ thống số nhị phân [cơ số 2]
Hệ thống số nhị phân có hai ký hiệu.
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05 và
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06, được gọi là bit. Nó cũng là một ký hiệu vị trí, ví dụ,
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^0
Chúng ta sẽ biểu thị một số nhị phân có hậu tố
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH2. Một số ngôn ngữ lập trình biểu thị số nhị phân với tiền tố
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH3 hoặc
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH4 [e. g. ,
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH5] hoặc tiền tố
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH6 với các bit được trích dẫn [e. g. ,
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH7]
Một chữ số nhị phân được gọi là một bit. Tám bit được gọi là một byte [tại sao lại là đơn vị 8 bit? Chắc là vì
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH8]
Hệ thống số thập lục phân [Cơ số 16]
Hệ thống số thập lục phân sử dụng 16 ký hiệu.
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^07,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^08,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^09,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B0,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B1,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B2,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B3,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B4,
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r09,
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH2,
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]1,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B9,
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]3, và
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]4, được gọi là các chữ số hex. Đó là một ký hiệu vị trí, ví dụ,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
Chúng ta sẽ biểu thị một số thập lục phân [viết tắt là hex] bằng hậu tố
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]5. Một số ngôn ngữ lập trình biểu thị các số hex bằng tiền tố
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]6 hoặc
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]7 [e. g. ,
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]8] hoặc tiền tố
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]9 với các chữ số hex được trích dẫn [e. g. ,
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]0]
Mỗi chữ số thập lục phân còn được gọi là chữ số hex. Hầu hết các ngôn ngữ lập trình đều chấp nhận chữ thường
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]1 đến
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]2 cũng như chữ hoa
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]3 đến
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]4
Máy tính sử dụng hệ thống nhị phân trong các hoạt động bên trong của chúng, vì chúng được xây dựng từ các thành phần điện tử kỹ thuật số nhị phân với 2 trạng thái - bật và tắt. Tuy nhiên, việc viết hoặc đọc một chuỗi dài các bit nhị phân rất cồng kềnh và dễ bị lỗi [hãy thử đọc chuỗi nhị phân này.
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]5, giống với hệ thập lục phân
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]6]. Hệ thập lục phân được sử dụng dưới dạng rút gọn hoặc viết tắt cho các bit nhị phân. Mỗi chữ số hex tương đương với 4 bit nhị phân, i. e. , viết tắt cho 4 bit, như sauHexadecimalBinaryDecimal000000100011200102300113401004501015601106701117810008910019A101010B101111C110012D110113E111014F111115
Chuyển đổi từ thập lục phân sang nhị phân
Thay thế mỗi chữ số hex bằng 4 bit tương đương [như được liệt kê trong bảng trên], ví dụ:
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
Chuyển đổi từ nhị phân sang thập lục phân
Bắt đầu từ bit ngoài cùng bên phải [bit ít quan trọng nhất], thay thế từng nhóm 4 bit bằng chữ số hex tương đương [đệm các bit ngoài cùng bên trái bằng 0 nếu cần], ví dụ:
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
Điều quan trọng cần lưu ý là số thập lục phân cung cấp một dạng nhỏ gọn hoặc tốc ký để biểu thị các bit nhị phân
Chuyển đổi từ Cơ số To convert 261[base 10] to hexadecimal:
261/16 => quotient=16 remainder=5
16/16 => quotient=1 remainder=0
1/16 => quotient=0 remainder=1 [quotient=0 stop]
Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]
7 sang Số thập phân [Cơ số 10]
Cho một cơ số r có n chữ số.
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]8 [cơ số r], số thập phân tương đương được cho bởi
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
Ví dụ như,
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]
Chuyển đổi từ Số thập phân [Cơ số 10] sang Cơ số To convert 261[base 10] to hexadecimal:
261/16 => quotient=16 remainder=5
16/16 => quotient=1 remainder=0
1/16 => quotient=0 remainder=1 [quotient=0 stop]
Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]
7
Sử dụng phép chia/số dư lặp đi lặp lại. Ví dụ,
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]
The above procedure is actually applicable to conversion between any 2 base systems. For example,
To convert 1023[base 4] to base 3: 1023[base 4]/3 => quotient=25D remainder=0 25D/3 => quotient=8D remainder=1 8D/3 => quotient=2D remainder=2 2D/3 => quotient=0 remainder=2 [quotient=0 stop] Hence, 1023[base 4] = 2210[base 3]
Conversion between Two Number Systems with Fractional Part
- Separate the integral and the fractional parts
- For the integral part, divide by the target radix repeatably, and collect the ramainder in reverse order
- For the fractional part, multiply the fractional part by the target radix repeatably, and collect the integral part in the same order
ví dụ 1. thập phân sang nhị phân
Convert 18.6875D to binary Integral Part = 18D 18/2 => quotient=9 remainder=0 9/2 => quotient=4 remainder=1 4/2 => quotient=2 remainder=0 2/2 => quotient=1 remainder=0 1/2 => quotient=0 remainder=1 [quotient=0 stop] Hence, 18D = 10010B Fractional Part = .6875D .6875*2=1.375 => whole number is 1 .375*2=0.75 => whole number is 0 .75*2=1.5 => whole number is 1 .5*2=1.0 => whole number is 1 Hence .6875D = .1011B Combine, 18.6875D = 10010.1011B
Example 2. Decimal to Hexadecimal
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^00
Exercises [Number Systems Conversion]
- Convert the following decimal numbers into binary and hexadecimal numbers
- Convert the following binary numbers into hexadecimal and decimal numbers
To convert 1023[base 4] to base 3: 1023[base 4]/3 => quotient=25D remainder=0 25D/3 => quotient=8D remainder=1 8D/3 => quotient=2D remainder=2 2D/3 => quotient=0 remainder=2 [quotient=0 stop] Hence, 1023[base 4] = 2210[base 3]
0To convert 1023[base 4] to base 3: 1023[base 4]/3 => quotient=25D remainder=0 25D/3 => quotient=8D remainder=1 8D/3 => quotient=2D remainder=2 2D/3 => quotient=0 remainder=2 [quotient=0 stop] Hence, 1023[base 4] = 2210[base 3]
1To convert 1023[base 4] to base 3: 1023[base 4]/3 => quotient=25D remainder=0 25D/3 => quotient=8D remainder=1 8D/3 => quotient=2D remainder=2 2D/3 => quotient=0 remainder=2 [quotient=0 stop] Hence, 1023[base 4] = 2210[base 3]
2
- Convert the following hexadecimal numbers into binary and decimal numbers
- Convert the following decimal numbers into binary equivalent
Answers. You could use the Windows' Calculator [
To convert 1023[base 4] to base 3: 1023[base 4]/3 => quotient=25D remainder=0 25D/3 => quotient=8D remainder=1 8D/3 => quotient=2D remainder=2 2D/3 => quotient=0 remainder=2 [quotient=0 stop] Hence, 1023[base 4] = 2210[base 3]3] to carry out number system conversion, by setting it to the Programmer or scientific mode. [Chạy "calc" ⇒ Chọn menu "Cài đặt" ⇒ Chọn chế độ "Lập trình viên" hoặc "Khoa học". ]
To convert 1023[base 4] to base 3: 1023[base 4]/3 => quotient=25D remainder=0 25D/3 => quotient=8D remainder=1 8D/3 => quotient=2D remainder=2 2D/3 => quotient=0 remainder=2 [quotient=0 stop] Hence, 1023[base 4] = 2210[base 3]
4,To convert 1023[base 4] to base 3: 1023[base 4]/3 => quotient=25D remainder=0 25D/3 => quotient=8D remainder=1 8D/3 => quotient=2D remainder=2 2D/3 => quotient=0 remainder=2 [quotient=0 stop] Hence, 1023[base 4] = 2210[base 3]
5,To convert 1023[base 4] to base 3: 1023[base 4]/3 => quotient=25D remainder=0 25D/3 => quotient=8D remainder=1 8D/3 => quotient=2D remainder=2 2D/3 => quotient=0 remainder=2 [quotient=0 stop] Hence, 1023[base 4] = 2210[base 3]
6,To convert 1023[base 4] to base 3: 1023[base 4]/3 => quotient=25D remainder=0 25D/3 => quotient=8D remainder=1 8D/3 => quotient=2D remainder=2 2D/3 => quotient=0 remainder=2 [quotient=0 stop] Hence, 1023[base 4] = 2210[base 3]
7,To convert 1023[base 4] to base 3: 1023[base 4]/3 => quotient=25D remainder=0 25D/3 => quotient=8D remainder=1 8D/3 => quotient=2D remainder=2 2D/3 => quotient=0 remainder=2 [quotient=0 stop] Hence, 1023[base 4] = 2210[base 3]
8,To convert 1023[base 4] to base 3: 1023[base 4]/3 => quotient=25D remainder=0 25D/3 => quotient=8D remainder=1 8D/3 => quotient=2D remainder=2 2D/3 => quotient=0 remainder=2 [quotient=0 stop] Hence, 1023[base 4] = 2210[base 3]
9Convert 18.6875D to binary Integral Part = 18D 18/2 => quotient=9 remainder=0 9/2 => quotient=4 remainder=1 4/2 => quotient=2 remainder=0 2/2 => quotient=1 remainder=0 1/2 => quotient=0 remainder=1 [quotient=0 stop] Hence, 18D = 10010B Fractional Part = .6875D .6875*2=1.375 => whole number is 1 .375*2=0.75 => whole number is 0 .75*2=1.5 => whole number is 1 .5*2=1.0 => whole number is 1 Hence .6875D = .1011B Combine, 18.6875D = 10010.1011B
0,Convert 18.6875D to binary Integral Part = 18D 18/2 => quotient=9 remainder=0 9/2 => quotient=4 remainder=1 4/2 => quotient=2 remainder=0 2/2 => quotient=1 remainder=0 1/2 => quotient=0 remainder=1 [quotient=0 stop] Hence, 18D = 10010B Fractional Part = .6875D .6875*2=1.375 => whole number is 1 .375*2=0.75 => whole number is 0 .75*2=1.5 => whole number is 1 .5*2=1.0 => whole number is 1 Hence .6875D = .1011B Combine, 18.6875D = 10010.1011B
1,Convert 18.6875D to binary Integral Part = 18D 18/2 => quotient=9 remainder=0 9/2 => quotient=4 remainder=1 4/2 => quotient=2 remainder=0 2/2 => quotient=1 remainder=0 1/2 => quotient=0 remainder=1 [quotient=0 stop] Hence, 18D = 10010B Fractional Part = .6875D .6875*2=1.375 => whole number is 1 .375*2=0.75 => whole number is 0 .75*2=1.5 => whole number is 1 .5*2=1.0 => whole number is 1 Hence .6875D = .1011B Combine, 18.6875D = 10010.1011B
2,Convert 18.6875D to binary Integral Part = 18D 18/2 => quotient=9 remainder=0 9/2 => quotient=4 remainder=1 4/2 => quotient=2 remainder=0 2/2 => quotient=1 remainder=0 1/2 => quotient=0 remainder=1 [quotient=0 stop] Hence, 18D = 10010B Fractional Part = .6875D .6875*2=1.375 => whole number is 1 .375*2=0.75 => whole number is 0 .75*2=1.5 => whole number is 1 .5*2=1.0 => whole number is 1 Hence .6875D = .1011B Combine, 18.6875D = 10010.1011B
3,Convert 18.6875D to binary Integral Part = 18D 18/2 => quotient=9 remainder=0 9/2 => quotient=4 remainder=1 4/2 => quotient=2 remainder=0 2/2 => quotient=1 remainder=0 1/2 => quotient=0 remainder=1 [quotient=0 stop] Hence, 18D = 10010B Fractional Part = .6875D .6875*2=1.375 => whole number is 1 .375*2=0.75 => whole number is 0 .75*2=1.5 => whole number is 1 .5*2=1.0 => whole number is 1 Hence .6875D = .1011B Combine, 18.6875D = 10010.1011B
4,Convert 18.6875D to binary Integral Part = 18D 18/2 => quotient=9 remainder=0 9/2 => quotient=4 remainder=1 4/2 => quotient=2 remainder=0 2/2 => quotient=1 remainder=0 1/2 => quotient=0 remainder=1 [quotient=0 stop] Hence, 18D = 10010B Fractional Part = .6875D .6875*2=1.375 => whole number is 1 .375*2=0.75 => whole number is 0 .75*2=1.5 => whole number is 1 .5*2=1.0 => whole number is 1 Hence .6875D = .1011B Combine, 18.6875D = 10010.1011B
5Convert 18.6875D to binary Integral Part = 18D 18/2 => quotient=9 remainder=0 9/2 => quotient=4 remainder=1 4/2 => quotient=2 remainder=0 2/2 => quotient=1 remainder=0 1/2 => quotient=0 remainder=1 [quotient=0 stop] Hence, 18D = 10010B Fractional Part = .6875D .6875*2=1.375 => whole number is 1 .375*2=0.75 => whole number is 0 .75*2=1.5 => whole number is 1 .5*2=1.0 => whole number is 1 Hence .6875D = .1011B Combine, 18.6875D = 10010.1011B
6,Convert 18.6875D to binary Integral Part = 18D 18/2 => quotient=9 remainder=0 9/2 => quotient=4 remainder=1 4/2 => quotient=2 remainder=0 2/2 => quotient=1 remainder=0 1/2 => quotient=0 remainder=1 [quotient=0 stop] Hence, 18D = 10010B Fractional Part = .6875D .6875*2=1.375 => whole number is 1 .375*2=0.75 => whole number is 0 .75*2=1.5 => whole number is 1 .5*2=1.0 => whole number is 1 Hence .6875D = .1011B Combine, 18.6875D = 10010.1011B
7,Convert 18.6875D to binary Integral Part = 18D 18/2 => quotient=9 remainder=0 9/2 => quotient=4 remainder=1 4/2 => quotient=2 remainder=0 2/2 => quotient=1 remainder=0 1/2 => quotient=0 remainder=1 [quotient=0 stop] Hence, 18D = 10010B Fractional Part = .6875D .6875*2=1.375 => whole number is 1 .375*2=0.75 => whole number is 0 .75*2=1.5 => whole number is 1 .5*2=1.0 => whole number is 1 Hence .6875D = .1011B Combine, 18.6875D = 10010.1011B
8,Convert 18.6875D to binary Integral Part = 18D 18/2 => quotient=9 remainder=0 9/2 => quotient=4 remainder=1 4/2 => quotient=2 remainder=0 2/2 => quotient=1 remainder=0 1/2 => quotient=0 remainder=1 [quotient=0 stop] Hence, 18D = 10010B Fractional Part = .6875D .6875*2=1.375 => whole number is 1 .375*2=0.75 => whole number is 0 .75*2=1.5 => whole number is 1 .5*2=1.0 => whole number is 1 Hence .6875D = .1011B Combine, 18.6875D = 10010.1011B
9,10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^0
00,10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^0
01- ?? [You work it out. ]
Computer Memory & Data Representation
Computer uses a fixed number of bits to represent a piece of data, which could be a number, a character, or others. A n-bit storage location can represent up to
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^002 distinct entities. For example, a 3-bit memory location can hold one of these eight binary patterns.
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^003,
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^004,
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^005,
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^006,
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^007,
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^008,
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^009, or
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^010. Hence, it can represent at most 8 distinct entities. You could use them to represent numbers 0 to 7, numbers 8881 to 8888, characters 'A' to 'H', or up to 8 kinds of fruits like apple, orange, banana; or up to 8 kinds of animals like lion, tiger, etc
Integers, for example, can be represented in 8-bit, 16-bit, 32-bit or 64-bit. You, as the programmer, choose an appropriate bit-length for your integers. Your choice will impose constraint on the range of integers that can be represented. Besides the bit-length, an integer can be represented in various representation schemes, e. g. , unsigned vs. signed integers. An 8-bit unsigned integer has a range of 0 to 255, while an 8-bit signed integer has a range of -128 to 127 - both representing 256 distinct numbers
It is important to note that a computer memory location merely stores a binary pattern. It is entirely up to you, as the programmer, to decide on how these patterns are to be interpreted. For example, the 8-bit binary pattern
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^011 can be interpreted as an unsigned integer
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^012, or an ASCII character
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]3, or some secret information known only to you. In other words, you have to first decide how to represent a piece of data in a binary pattern before the binary patterns make sense. The interpretation of binary pattern is called data representation or encoding. Furthermore, it is important that the data representation schemes are agreed-upon by all the parties, i. e. , industrial standards need to be formulated and straightly followed
Once you decided on the data representation scheme, certain constraints, in particular, the precision and range will be imposed. Hence, it is important to understand data representation to write correct and high-performance programs
Rosette Stone and the Decipherment of Egyptian HieroglyphsEgyptian hieroglyphs [next-to-left] were used by the ancient Egyptians since 4000BC. Unfortunately, since 500AD, no one could longer read the ancient Egyptian hieroglyphs, until the re-discovery of the Rosette Stone in 1799 by Napoleon's troop [during Napoleon's Egyptian invasion] near the town of Rashid [Rosetta] in the Nile Delta
The Rosetta Stone [left] is inscribed with a decree in 196BC on behalf of King Ptolemy V. The decree appears in three scripts. the upper text is Ancient Egyptian hieroglyphs, the middle portion Demotic script, and the lowest Ancient Greek. Because it presents essentially the same text in all three scripts, and Ancient Greek could still be understood, it provided the key to the decipherment of the Egyptian hieroglyphs
The moral of the story is unless you know the encoding scheme, there is no way that you can decode the data
Reference and images. Wikipedia
Integer Representation
Integers are whole numbers or fixed-point numbers with the radix point fixed after the least-significant bit. They are contrast to real numbers or floating-point numbers, where the position of the radix point varies. It is important to take note that integers and floating-point numbers are treated differently in computers. They have different representation and are processed differently [e. g. , floating-point numbers are processed in a so-called floating-point processor]. Floating-point numbers will be discussed later
Computers use a fixed number of bits to represent an integer. The commonly-used bit-lengths for integers are 8-bit, 16-bit, 32-bit or 64-bit. Besides bit-lengths, there are two representation schemes for integers
- Unsigned Integers. có thể đại diện cho số không và số nguyên dương
- Signed Integers. can represent zero, positive and negative integers. Three representation schemes had been proposed for signed integers
- Sign-Magnitude representation
- 1's Complement representation
- 2's Complement representation
You, as the programmer, need to decide on the bit-length and representation scheme for your integers, depending on your application's requirements. Suppose that you need a counter for counting a small quantity from 0 up to 200, you might choose the 8-bit unsigned integer scheme as there is no negative numbers involved
n-bit Unsigned Integers
Unsigned integers can represent zero and positive integers, but not negative integers. The value of an unsigned integer is interpreted as "the magnitude of its underlying binary pattern"
Example 1. Suppose that
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 and the binary pattern is
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^015, the value of this unsigned integer is
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^016
Example 2. Suppose that
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^017 and the binary pattern is
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^018, the value of this unsigned integer is
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^019
Example 3. Suppose that
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^017 and the binary pattern is
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^021, the value of this unsigned integer is
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05
An n-bit pattern can represent
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^002 distinct integers. An n-bit unsigned integer can represent integers from
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05 to
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^025, as tabulated belownMinimumMaximum80[2^8]-1 [=255]160[2^16]-1 [=65,535]320[2^32]-1 [=4,294,967,295] [9+ digits]640[2^64]-1 [=18,446,744,073,709,551,615] [19+ digits]
Signed Integers
Signed integers can represent zero, positive integers, as well as negative integers. Three representation schemes are available for signed integers
- Sign-Magnitude representation
- 1's Complement representation
- 2's Complement representation
In all the above three schemes, the most-significant bit [msb] is called the sign bit. Bit dấu được sử dụng để biểu thị dấu của số nguyên - với 0 cho số nguyên dương và 1 cho số nguyên âm. Tuy nhiên, độ lớn của số nguyên được hiểu khác nhau trong các sơ đồ khác nhau
Các số nguyên có dấu n-bit trong biểu diễn độ lớn của dấu
Trong đại diện ký hiệu cường độ
- Bit quan trọng nhất [msb] là bit dấu, với giá trị 0 biểu thị số nguyên dương và 1 biểu thị số nguyên âm
- n-1 bit còn lại đại diện cho độ lớn [giá trị tuyệt đối] của số nguyên. Giá trị tuyệt đối của số nguyên được hiểu là "độ lớn của mẫu nhị phân [n-1]-bit"
ví dụ 1. Giả sử rằng
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 và biểu diễn nhị phân là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^027
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05 ⇒ dương
Giá trị tuyệt đối là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^029
Do đó, số nguyên là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^030
ví dụ 2. Giả sử rằng
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 và biểu diễn nhị phân là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^032
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06 ⇒ âm
Giá trị tuyệt đối là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^034
Do đó, số nguyên là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^035
ví dụ 3. Giả sử rằng
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 và biểu diễn nhị phân là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^037
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05 ⇒ dương
Giá trị tuyệt đối là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^039
Do đó, số nguyên là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^040
Ví dụ 4. Giả sử rằng
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 và biểu diễn nhị phân là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^042
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06 ⇒ âm
Giá trị tuyệt đối là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^039
Do đó, số nguyên là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^045
Những hạn chế của đại diện ký hiệu cường độ là
- Có hai cách biểu diễn [
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^0
46 và10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^0
47] cho số 0, điều này có thể dẫn đến sự không hiệu quả và nhầm lẫn - Số nguyên dương và số âm cần được xử lý riêng
Số nguyên có dấu n-bit trong biểu diễn phần bù của 1
Trong đại diện bổ sung của 1
- Một lần nữa, bit quan trọng nhất [msb] là bit dấu, với giá trị 0 đại diện cho số nguyên dương và 1 đại diện cho số nguyên âm
- N-1 bit còn lại đại diện cho độ lớn của số nguyên, như sau
- đối với các số nguyên dương, giá trị tuyệt đối của số nguyên bằng "độ lớn của mẫu nhị phân [n-1]-bit"
- for negative integers, the absolute value of the integer is equal to "the magnitude of the complement [inverse] of the [n-1]-bit binary pattern" [hence called 1's complement]
ví dụ 1. Suppose that
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 and the binary representation
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^027
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05 ⇒ dương
Giá trị tuyệt đối là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^029
Do đó, số nguyên là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^030
Example 2. Suppose that
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 and the binary representation
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^032
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06 ⇒ âm
Absolute value is the complement of
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^056, i. e. ,
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^057
Hence, the integer is
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^058
Example 3. Suppose that
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 and the binary representation
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^037
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05 ⇒ dương
Giá trị tuyệt đối là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^039
Do đó, số nguyên là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^040
Example 4. Suppose that
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 and the binary representation
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^065
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06 ⇒ âm
Absolute value is the complement of
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^067, i. e. ,
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^039
Do đó, số nguyên là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^045
Again, the drawbacks are
- There are two representations [
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^0
46 and10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^0
71] for zero - The positive integers and negative integers need to be processed separately
n-bit Sign Integers in 2's Complement Representation
In 2's complement representation
- Một lần nữa, bit quan trọng nhất [msb] là bit dấu, với giá trị 0 đại diện cho số nguyên dương và 1 đại diện cho số nguyên âm
- N-1 bit còn lại đại diện cho độ lớn của số nguyên, như sau
- đối với các số nguyên dương, giá trị tuyệt đối của số nguyên bằng "độ lớn của mẫu nhị phân [n-1]-bit"
- đối với các số nguyên âm, giá trị tuyệt đối của số nguyên bằng "độ lớn của phần bù của mẫu nhị phân [n-1]-bit cộng với một" [do đó được gọi là phần bù 2]
ví dụ 1. Suppose that
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 and the binary representation
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^027
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05 ⇒ dương
Giá trị tuyệt đối là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^029
Do đó, số nguyên là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^030
Example 2. Suppose that
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 and the binary representation
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^032
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06 ⇒ âm
Giá trị tuyệt đối là phần bù của
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^056 cộng với
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06, i. e. ,
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^082
Do đó, số nguyên là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^083
Example 3. Suppose that
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 and the binary representation
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^037
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05 ⇒ dương
Giá trị tuyệt đối là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^039
Do đó, số nguyên là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^040
Example 4. Suppose that
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014 and the binary representation
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^065
Bit dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06 ⇒ âm
Giá trị tuyệt đối là phần bù của
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^067 cộng với
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06, i. e. ,
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^094
Do đó, số nguyên là
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^035
Máy tính sử dụng biểu diễn bù của 2 cho các số nguyên có dấu
Chúng ta đã thảo luận về ba cách biểu diễn cho số nguyên có dấu. độ lớn có dấu, phần bù 1 và phần bù 2. Máy tính sử dụng phần bù 2 để biểu diễn các số nguyên có dấu. Điều này là do
- Chỉ có một biểu diễn cho số 0 trong phần bù 2, thay vì hai biểu diễn theo độ lớn dấu và phần bù 1
- Các số nguyên dương và âm có thể được xử lý cùng nhau trong phép cộng và phép trừ. Phép trừ có thể được thực hiện bằng "logic cộng"
ví dụ 1. Phép Cộng Hai Số Nguyên Dương. Giả sử rằng
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^096
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^01
ví dụ 2. Phép trừ được coi là phép cộng của số nguyên dương và số âm. Giả sử rằng
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^097
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^02
ví dụ 3. Phép Cộng Hai Số Nguyên Âm. Giả sử rằng
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^098
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^03
Vì độ chính xác cố định [i. e. , số bit cố định], số nguyên có dấu bổ sung của n-bit 2 có một phạm vi nhất định. Ví dụ: đối với
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^014, phạm vi của các số nguyên có dấu phần bù của 2 là từ
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^000 đến
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^001. Trong quá trình cộng [và trừ], điều quan trọng là phải kiểm tra xem kết quả có vượt quá phạm vi này hay không, nói cách khác, liệu có xảy ra tràn hoặc tràn
Ví dụ 4. Tràn ra. Suppose that
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^002 [overflow - beyond the range]
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^04
Example 5. Underflow. Suppose that
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^003 [underflow - below the range]
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^05
The following diagram explains how the 2's complement works. By re-arranging the number line, values from
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^000 to
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^001 are represented contiguously by ignoring the carry bit
Range of n-bit 2's Complement Signed Integers
An n-bit 2's complement signed integer can represent integers from
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^006 to
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^007, as tabulated. Take note that the scheme can represent all the integers within the range, without any gap. In other words, there is no missing integers within the supported rangenminimummaximum8-[2^7] [=-128]+[2^7]-1 [=+127]16-[2^15] [=-32,768]+[2^15]-1 [=+32,767]32-[2^31] [=-2,147,483,648]+[2^31]-1 [=+2,147,483,647][9+ digits]64-[2^63] [=-9,223,372,036,854,775,808]+[2^63]-1 [=+9,223,372,036,854,775,807][18+ digits]
Decoding 2's Complement Numbers
- Check the sign bit [denoted as
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
08] - If
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
09, the number is positive and its absolute value is the binary value of the remaining n-1 bits - If
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
10, the number is negative. you could "invert the n-1 bits and plus 1" to get the absolute value of negative number
Alternatively, you could scan the remaining n-1 bits from the right [least-significant bit]. Look for the first occurrence of 1. Flip all the bits to the left of that first occurrence of 1. The flipped pattern gives the absolute value. For example,10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^0
6
Big Endian vs. Little Endian
Modern computers store one byte of data in each memory address or location, i. e. , byte addressable memory. An 32-bit integer is, therefore, stored in 4 memory addresses
The term"Endian" refers to the order of storing bytes in computer memory. Trong sơ đồ "Big Endian", byte quan trọng nhất được lưu trữ đầu tiên trong địa chỉ bộ nhớ thấp nhất [hoặc lớn trước], trong khi "Little Endian" lưu trữ các byte ít quan trọng nhất trong địa chỉ bộ nhớ thấp nhất
Ví dụ: số nguyên 32 bit 12345678H [30541989610] được lưu dưới dạng 12H 34H 56H 78H trong big endian; . Một số nguyên 16 bit 00H 01H được hiểu là 0001H trong big endian và 0100H là little endian
Bài tập [Biểu diễn số nguyên]
- Phạm vi của số nguyên 8 bit, 16 bit, 32 bit và 64 bit, trong biểu diễn "không dấu" và "đã ký" là gì?
- Đưa ra giá trị của
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
11,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
5,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
6,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
14 vàA3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
15 đại diện không dấu trong 8 bit - Đưa ra giá trị của
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
16,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
17 ,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
18,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
5,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
20,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
00 vàA3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
01 trong biểu diễn có chữ ký của phần bù 8 bit 2 - Đưa ra giá trị của
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
16,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
17 ,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
18,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
5,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
20,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
28 vàA3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
01 trong biểu diễn độ lớn dấu 8 bit - Đưa ra giá trị của
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
16,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
17 ,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
18,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
5,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
20,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
28 vàA3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
01 trong biểu diễn phần bù 1 8 bit - [TODO] thêm
- Phạm vi của các số nguyên n-bit không dấu là
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
37. Phạm vi của số nguyên có dấu bổ sung của n-bit 2 làA3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
38; A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
39,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
40,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
41,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
42,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
43A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
44,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
45,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
46,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
40,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
48,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
49,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
50A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
44,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
52,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
53,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
54,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
48,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
56,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
50A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
44,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
59,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
60,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
61,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
48,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
63,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
50
Biểu diễn số dấu phẩy động
Số dấu phẩy động [hoặc số thực] có thể đại diện cho một giá trị rất lớn [
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^065] hoặc rất nhỏ [
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^066]. Nó cũng có thể đại diện cho số âm rất lớn [_______0_______67] và số âm rất nhỏ [
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^067], cũng như số 0, như minh họa
Một số dấu phẩy động thường được thể hiện trong ký hiệu khoa học, với một phân số [
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]4] và một số mũ [
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]3] của một cơ số nhất định [
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]7], ở dạng
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^072. Số thập phân sử dụng cơ số là 10 [_______0_______73];
Representation of floating point number is not unique. Ví dụ: số
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^075 có thể được biểu diễn dưới dạng
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^076,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^077,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^078, v.v. Phần phân số có thể được chuẩn hóa. In the normalized form, there is only a single non-zero digit before the radix point. Ví dụ: số thập phân
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^079 có thể được chuẩn hóa thành
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^080;
Điều quan trọng cần lưu ý là các số dấu phẩy động bị mất độ chính xác khi được biểu diễn bằng một số bit cố định [e. g. , 32-bit hoặc 64-bit]. Điều này là do có vô số số thực [ngay cả trong một phạm vi nhỏ nói 0. 0 đến 0. 1]. Mặt khác, một mẫu nhị phân n-bit có thể biểu thị một số hữu hạn
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^002 khác biệt. Do đó, không phải tất cả các số thực đều có thể được biểu diễn. Thay vào đó, giá trị gần đúng nhất sẽ được sử dụng, dẫn đến mất độ chính xác
Cũng cần lưu ý rằng số học số thực kém hiệu quả hơn nhiều so với số học số nguyên. Nó có thể được tăng tốc với cái gọi là bộ đồng xử lý dấu phẩy động chuyên dụng. Do đó, hãy sử dụng số nguyên nếu ứng dụng của bạn không yêu cầu số dấu phẩy động
Trong máy tính, các số dấu phẩy động được biểu diễn dưới dạng ký hiệu khoa học của phân số [
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]4] và số mũ [
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]3] với cơ số là 2, ở dạng
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^074. Cả
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]3 và
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]4 đều có thể tích cực cũng như tiêu cực. Modern computers adopt IEEE 754 standard for representing floating-point numbers. There are two representation schemes. 32-bit single-precision and 64-bit double-precision
IEEE-754 32-bit Single-Precision Floating-Point Numbers
In 32-bit single-precision floating-point representation
- The most significant bit is the sign bit [
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
08], with 0 for positive numbers and 1 for negative numbers - The following 8 bits represent exponent [
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]
3] - The remaining 23 bits represents fraction [
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]
4]
Let's illustrate with an example, suppose that the 32-bit pattern is
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^092, with
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
93A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
94A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
95
In the normalized form, the actual fraction is normalized with an implicit leading 1 in the form of
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^096. In this example, the actual fraction is
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^097
The sign bit represents the sign of the number, with
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^009 for positive and
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^010 for negative number. In this example with
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^010, this is a negative number, i. e. ,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B01
In normalized form, the actual exponent is
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B02 [so-called excess-127 or bias-127]. This is because we need to represent both positive and negative exponent. With an 8-bit E, ranging from 0 to 255, the excess-127 scheme could provide actual exponent of -127 to 128. In this example,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B03
Hence, the number represented is
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B04De-Normalized Form
Normalized form has a serious problem, with an implicit leading 1 for the fraction, it cannot represent the number zero. Convince yourself on this
De-normalized form was devised to represent zero and other numbers
For
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B05, the numbers are in the de-normalized form. An implicit leading 0 [instead of 1] is used for the fraction; and the actual exponent is always
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B06. Hence, the number zero can be represented with
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B05 and
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B08 [because
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B09]
We can also represent very small positive and negative numbers in de-normalized form with
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B05. For example, if
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^010,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B05, and
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B13. The actual fraction is
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B14. Since
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^010, it is a negative number. With
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B05, the actual exponent is
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B06. Hence the number is
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B18, which is an extremely small negative number [close to zero]Summary
In summary, the value [
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B19] is calculated as follows
- For
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
20. These numbers are in the so-called normalized form. The sign-bit represents the sign of the number. Fractional part [A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
96] are normalized with an implicit leading 1. The exponent is bias [or in excess] ofA3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
14, so as to represent both positive and negative exponent. The range of exponent isA3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
06 toA3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
01 - For
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
25. These numbers are in the so-called denormalized form. The exponent ofA3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
26 evaluates to a very small number. Denormalized form is needed to represent zero [withA3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
08 andA3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
05]. It can also represents very small positive and negative number close to zero - For
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
29, it represents special values, such asA3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
30 [positive and negative infinity] andA3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
31 [not a number]. This is beyond the scope of this article
Example 1. Suppose that IEEE-754 32-bit floating-point representation pattern is
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B32
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^07
Example 2. Suppose that IEEE-754 32-bit floating-point representation pattern is
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B33
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^08
ví dụ 3. Giả sử rằng mẫu biểu diễn dấu phẩy động 32-bit IEEE-754 là
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B34
10110B = 10000B + 0000B + 100B + 10B + 0B = 1×2^4 + 0×2^3 + 1×2^2 + 1×2^1 + 0×2^09
Ví dụ 4 [Dạng khử chuẩn hóa]. Giả sử rằng mẫu biểu diễn dấu phẩy động 32-bit IEEE-754 là
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B35
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^00
Bài tập [Số dấu phẩy động]
- Tính toán các số dương lớn nhất và nhỏ nhất có thể được biểu diễn ở dạng chuẩn hóa 32 bit
- Tính toán các số âm lớn nhất và nhỏ nhất có thể được biểu diễn ở dạng chuẩn hóa 32 bit
- Lặp lại [1] cho dạng không chuẩn hóa 32 bit
- Lặp lại [2] cho dạng không chuẩn hóa 32 bit
- Số dương lớn nhất.
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
09,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
37,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
38
Số dương nhỏ nhất.A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
09,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
40,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
41 - Tương tự như trên, nhưng
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
10 - Số dương lớn nhất.
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
09,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
05,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
38
Số dương nhỏ nhất.A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
09,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
05,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
48 - Tương tự như trên, nhưng
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
10
Bạn có thể sử dụng các phương thức JDK
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B50 hoặc
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B51 để tạo một 32-bit
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B52 có độ chính xác đơn hoặc 64-bit
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B53 có độ chính xác kép với các mẫu bit cụ thể và in các giá trị của chúng. Ví dụ như,
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^01
Số dấu phẩy động chính xác kép 64 bit IEEE-754
Sơ đồ biểu diễn cho độ chính xác kép 64 bit tương tự như độ chính xác đơn 32 bit
- The most significant bit is the sign bit [
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
08], with 0 for positive numbers and 1 for negative numbers - 11 bit sau đại diện cho số mũ [
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]
3] - 52 bit còn lại đại diện cho phân số [
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]
4]
Giá trị [
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B19] được tính như sau
- Normalized form. Cho
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
58 - dạng không chuẩn hóa. Cho
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
59. Đây là ở dạng không chuẩn hóa - Đối với
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
60,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
19 đại diện cho các giá trị đặc biệt, chẳng hạn nhưA3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
30 [vô cùng],A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
31 [không phải là số]
Tìm hiểu thêm về biểu diễn dấu phẩy động
Có ba phần trong biểu diễn dấu phẩy động
- Bit dấu [_______0_______08] là dễ hiểu [0 cho số dương và 1 cho số âm]
- Đối với số mũ [
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]
3], cái gọi là sai lệch [hoặc thừa] được áp dụng để biểu diễn cả số mũ dương và âm. Độ lệch được đặt ở một nửa phạm vi. Đối với độ chính xác đơn với số mũ 8 bit, độ lệch là 127 [hoặc vượt quá 127]. Đối với độ chính xác kép với số mũ 11 bit, độ lệch là 1023 [hoặc vượt quá 1023] - Phân số [
A1C2H = 10×16^3 + 1×16^2 + 12×16^1 + 2 = 41410 [base 10] 10110B = 1×2^4 + 1×2^2 + 1×2^1 = 22 [base 10]
4] [còn được gọi là phần định trị hoặc ý nghĩa] bao gồm một bit dẫn đầu ẩn [trước điểm cơ số] và các bit phân số [sau điểm cơ số]. Bit hàng đầu cho các số được chuẩn hóa là 1;
Ở dạng chuẩn hóa, điểm cơ số được đặt sau chữ số khác 0 đầu tiên, e, g. ,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B67,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B68. Đối với số nhị phân, bit đầu tiên luôn là 1 và không cần biểu diễn rõ ràng - điều này giúp tiết kiệm 1 bit dung lượng lưu trữ
Ở dạng chuẩn hóa của IEEE 754
- Đối với độ chính xác đơn,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
69 vượt quá 127. Do đó, số mũ thực tế là từA3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
06 đếnA3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
01. Số mũ âm được sử dụng để biểu diễn các số nhỏ [< 1. 0]; . 0]A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
72 - Đối với độ chính xác kép,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
73 vượt quá 1023. Số mũ thực tế là từA3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
74 đếnA3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
75, vàA3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
76
Lưu ý rằng mẫu n-bit có số lượng kết hợp hữu hạn [_______5_______77], có thể biểu thị các số phân biệt hữu hạn. Không thể biểu diễn các số vô hạn trong trục thực [ngay cả một phạm vi nhỏ cũng nói 0. 0 đến 1. 0 có vô số]. Nghĩa là, không phải tất cả các số dấu phẩy động đều có thể được biểu diễn chính xác. Thay vào đó, giá trị gần đúng nhất được sử dụng, dẫn đến mất độ chính xác
Các số dấu phẩy động chuẩn hóa tối thiểu và tối đa là
Độ chính xácChuẩn hóa N[tối thiểu]NChuẩn hóa[tối đa]Đơn0080 0000H0 00000001 00000000000000000000000B
E = 1, F = 0
N[tối thiểu] = 1. 0B × 2^-126
[≈1. 17549435 × 10^-38]7F7F FFFFH
0 11111110 00000000000000000000000B
E = 254, F = 0
N[tối đa] = 1. 1. 1B × 2^127 = [2 - 2^-23] × 2^127
[≈3. 4028235 × 10^38]Gấp đôi0010 0000 0000 0000H
N[tối thiểu] = 1. 0B × 2^-1022
[≈2. 2250738585072014 × 10^-308]7FEF FFFF FFFF FFFFH
N[tối đa] = 1. 1. 1B × 2^1023 = [2 - 2^-52] × 2^1023
[≈1. 7976931348623157 × 10^308]
Nếu
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B78, nhưng phân số khác 0, thì giá trị ở dạng không chuẩn hóa và bit đứng đầu bằng 0 được giả định, như sau
- Đối với độ chính xác đơn,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
78,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
80 - Đối với độ chính xác kép,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
78,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
82
Denormalized form can represent very small numbers closed to zero, and zero, which cannot be represented in normalized form, as shown in the above figure
Tối thiểu và tối đa của các số dấu phẩy động không chuẩn hóa là
Chính xácKhông chuẩn hóa D[tối thiểu]Không chuẩn hóa D[tối đa]Đơn0000 0001H0 00000000 00000000000000000000001B
E = 0, F = 00000000000000000000001B
D[min] = 0. 0. 1 × 2^-126 = 1 × 2^-23 × 2^-126 = 2^-149
[≈1. 4 × 10^-45]007F FFFFH
0 00000000 11111111111111111111111B
E = 0, F = 11111111111111111111111B
D[max] = 0. 1. 1 × 2^-126 = [1-2^-23]×2^-126
[≈1. 1754942 × 10^-38]Double0000 0000 0000 0001H
D[min] = 0. 0. 1 × 2^-1022 = 1 × 2^-52 × 2^-1022 = 2^-1074
[≈4. 9 × 10^-324]001F FFFF FFFF FFFFH
D[max] = 0. 1. 1 × 2^-1022 = [1-2^-52]×2^-1022
[≈4. 4501477170144023 × 10^-308]Special Values
Số không. Số không không thể được biểu diễn ở dạng chuẩn hóa và phải được biểu diễn ở dạng không chuẩn hóa với
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B05 và
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B08. Có hai cách biểu diễn cho số 0.
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B85 với
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^009 và
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B87 với
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^010
vô cực. Giá trị của +vô cực [e. g. ,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B89] và -infinity [e. g. ,
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B90] được biểu diễn bằng số mũ của tất cả 1 [_______5_______29 cho độ chính xác đơn và
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B60 cho độ chính xác kép],
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B08 và
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^009 [cho
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B95] và
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^010 [cho
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B97]
Không phải là số [NaN].
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B31 biểu thị một giá trị không thể được biểu diễn dưới dạng số thực [e. g.
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B99].
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B31 được biểu diễn bằng Số mũ của tất cả 1 [_______5_______29 cho độ chính xác đơn và
A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B60 cho độ chính xác kép] và bất kỳ phân số nào khác không
Mã hóa ký tự
Trong bộ nhớ máy tính, ký tự được "mã hóa" [hoặc "đại diện"] bằng cách sử dụng "lược đồ mã hóa ký tự" đã chọn [còn gọi là "bộ ký tự", "bộ ký tự", "bản đồ ký tự" hoặc "trang mã"]
Ví dụ: trong ASCII [cũng như Latin1, Unicode và nhiều bộ ký tự khác]
- mã số
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
03 đến1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
04 lần lượt đại diện choTo convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]
3 đến1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
06 - mã số
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
07 đến1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
08 lần lượt đại diện choTo convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]
1 đến1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
10 - mã số
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
11 đến1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
12 lần lượt đại diện cho1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
13 đến1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
14
Điều quan trọng cần lưu ý là sơ đồ biểu diễn phải được biết trước khi có thể diễn giải một mẫu nhị phân. e. g. , the 8-bit pattern "
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH15" could represent anything under the sun known only to the person encoded it
Các sơ đồ mã hóa ký tự được sử dụng phổ biến nhất là. 7-bit ASCII [ISO/IEC 646] và 8-bit Latin-x [ISO/IEC 8859-x] cho các ký tự Tây Âu và Unicode [ISO/IEC 10646] để quốc tế hóa [i18n]
Sơ đồ mã hóa 7 bit [chẳng hạn như ASCII] có thể biểu thị 128 ký tự và ký hiệu. Sơ đồ mã hóa ký tự 8 bit [chẳng hạn như Latin-x] có thể biểu thị 256 ký tự và ký hiệu;
Mã ASCII 7 bit [còn gọi là US-ASCII, ISO/IEC 646, ITU-T T. 50]
- ASCII [Mã tiêu chuẩn Mỹ để trao đổi thông tin] là một trong những sơ đồ mã hóa ký tự trước đó
- ASCII ban đầu là mã 7 bit. Nó đã được mở rộng thành 8 bit để sử dụng tốt hơn tổ chức bộ nhớ máy tính 8 bit. [Bit thứ 8 ban đầu được sử dụng để kiểm tra tính chẵn lẻ trong các máy tính đời đầu. ]
- Code numbers
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
16 to1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
17 are printable [displayable] characters as tabulated [arranged in hexadecimal and decimal] as follows:Hex0123456789ABCDEF2SP!"#$%&'[]*+,-./30123456789:;?4@ABCDEFGHIJKLMNO5PQRSTUVWXYZ[\]^_6`abcdefghijklmno7pqrstuvwxyz{|}~
Dec01234567893SP!"#$%&'4[]*+,-./01523456789:;6?@ABCDE7FGHIJKLMNO8PQRSTUVWXY9Z[\]^_`abc10defghijklm11nopqrstuvw12xyz{|}~- Code number
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
16 is the blank or space character 1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
13 to1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
14.1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
21 or1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
22 where1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
23 is the equivalent integer value1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
24To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]
3 to1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
06.1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
27 or1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
28.To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]
3 to1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
06 are continuous without gapTo convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]
1 to1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
10.1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
33 or1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
34.To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]
3 to1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
06 are also continuous without gap. However, there is a gap between uppercase and lowercase letters. To convert between upper and lowercase, flip the value of bit-5
- Code number
- Code numbers
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
37 to1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
38, and1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
39 are special control characters, which are non-printable [non-displayable], as tabulated below. Many of these characters were used in the early days for transmission control [e. g. , STX, ETX] and printer control [e. g. , Form-Feed], which are now obsolete. The remaining meaningful codes today are1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
40 for Tab [1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
41]1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
42 for Line-Feed or newline [LF or1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
43] and1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
44 for Carriage-Return [CR or1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
45], which are used as line delimiter [aka line separator, end-of-line] for text files. There is unfortunately no standard for line delimiter. Unixes and Mac use1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
42 [LF or "1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
47"], Windows use1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
48 [CR+LF or "1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
49"]. Programming languages such as C/C++/Java [which was created on Unix] use1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
42 [LF or "1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
47"]- In programming languages such as C/C++/Java, line-feed [
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
42] is denoted as1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
43, carriage-return [1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
44] as1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
55, tab [1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
40] as1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
41
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH582519EMEnd of Medium909HTHorizontal Tab
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH41261ASUBSubstitute100ALFLine Feed
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH43271BESCEscape110BVTVertical Feed281CIS4File Separator120CFFForm Feed
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]2291DIS3Group Separator130DCRCarriage Return
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH55301EIS2Record Separator140ESOShift Out311FIS1Unit Separator150FSIShift In1610DLEDatalink Escape1277FDELDelete
8-bit Latin-1 [aka ISO/IEC 8859-1]
ISO/IEC-8859 is a collection of 8-bit character encoding standards for the western languages
ISO/IEC 8859-1, aka Latin alphabet No. 1, or Latin-1 in short, is the most commonly-used encoding scheme for western european languages. It has 191 printable characters from the latin script, which covers languages like English, German, Italian, Portuguese and Spanish. Latin-1 is backward compatible with the 7-bit US-ASCII code. That is, the first 128 characters in Latin-1 [code numbers 0 to 127 [7FH]], is the same as US-ASCII. Code numbers 128 [80H] to 159 [9FH] are not assigned. Code numbers 160 [A0H] to 255 [FFH] are given as follows
Hex0123456789ABCDEFANBSP¡¢£¤¥¦§¨©ª«¬SHY®¯B°±²³´µ¶·¸¹º»¼½¾¿CÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏDÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßEàáâãäåæçèéêëìíîïFðñòóôõö÷øùúûüýþÿISO/IEC-8859 has 16 parts. Besides the most commonly-used Part 1, Part 2 is meant for Central European [Polish, Czech, Hungarian, etc], Part 3 for South European [Turkish, etc], Part 4 for North European [Estonian, Latvian, etc], Part 5 for Cyrillic, Part 6 for Arabic, Part 7 for Greek, Part 8 for Hebrew, Part 9 for Turkish, Part 10 for Nordic, Part 11 for Thai, Part 12 was abandon, Part 13 for Baltic Rim, Part 14 for Celtic, Part 15 for French, Finnish, etc. Part 16 for South-Eastern European
Other 8-bit Extension of US-ASCII [ASCII Extensions]
Beside the standardized ISO-8859-x, there are many 8-bit ASCII extensions, which are not compatible with each others
ANSI [American National Standards Institute] [aka Windows-1252, or Windows Codepage 1252]. for Latin alphabets used in the legacy DOS/Windows systems. It is a superset of ISO-8859-1 with code numbers 128 [80H] to 159 [9FH] assigned to displayable characters, such as "smart" single-quotes and double-quotes. A common problem in web browsers is that all the quotes and apostrophes [produced by "smart quotes" in some Microsoft software] were replaced with question marks or some strange symbols. Đó là vì tài liệu được gắn nhãn là ISO-8859-1 [thay vì Windows-1252], trong đó các số mã này không được xác định. Hầu hết các trình duyệt và ứng dụng email hiện đại coi bộ ký tự ISO-8859-1 là Windows-1252 để phù hợp với việc ghi nhãn sai như vậy
Hex0123456789ABCDEF8€‚ƒ„…†‡ˆ‰Š‹ŒŽ9''“”•–—™š›œžŸEBCDIC [Mã trao đổi thập phân được mã hóa nhị phân mở rộng]. Được sử dụng trong các máy tính IBM đời đầu
Unicode [còn gọi là Bộ ký tự chung ISO/IEC 10646]
Trước Unicode, không có sơ đồ mã hóa ký tự đơn nào có thể biểu thị các ký tự trong tất cả các ngôn ngữ. Ví dụ: Tây Âu sử dụng một số sơ đồ mã hóa [trong họ ISO-8859-x]. Ngay cả một ngôn ngữ đơn lẻ như tiếng Trung Quốc cũng có một vài lược đồ mã hóa [GB2312/GBK, BIG5]. Nhiều lược đồ mã hóa xung đột với nhau, tôi. e. , cùng một mã số được gán cho các ký tự khác nhau
Unicode nhằm mục đích cung cấp một sơ đồ mã hóa ký tự tiêu chuẩn, phổ biến, hiệu quả, thống nhất và rõ ràng. Tiêu chuẩn Unicode được duy trì bởi một tổ chức phi lợi nhuận có tên Unicode Consortium [@ www. unicode. tổ chức]. Unicode là tiêu chuẩn ISO/IEC 10646
Unicode tương thích ngược với 7-bit US-ASCII và 8-bit Latin-1 [ISO-8859-1]. Nghĩa là, 128 ký tự đầu tiên giống như US-ASCII;
Unicode ban đầu sử dụng 16 bit [được gọi là UCS-2 hoặc Bộ ký tự Unicode - 2 byte], có thể biểu thị tối đa 65.536 ký tự. Kể từ đó, nó đã được mở rộng lên hơn 16 bit, hiện tại là 21 bit. Phạm vi mã hợp pháp trong ISO/IEC 10646 hiện là từ U+0000H đến U+10FFFFH [21 bit hoặc khoảng 2 triệu ký tự], bao gồm tất cả các chữ viết lịch sử hiện tại và cổ đại. Phạm vi 16 bit ban đầu từ U+0000H đến U+FFFFH [65536 ký tự] được gọi là Mặt phẳng đa ngôn ngữ cơ bản [BMP], bao gồm tất cả các ngôn ngữ chính đang được sử dụng hiện nay. Các ký tự bên ngoài BMP được gọi là Ký tự phụ, không được sử dụng thường xuyên
Unicode có hai lược đồ mã hóa
- UCS-2 [Bộ ký tự chung - 2 byte]. Sử dụng 2 byte [16 bit], bao gồm 65.536 ký tự trong BMP. BMP là đủ cho hầu hết các ứng dụng. UCS-2 hiện đã lỗi thời
- UCS-4 [Bộ ký tự chung - 4 byte]. Sử dụng 4 byte [32 bit], bao gồm BMP và các ký tự bổ sung
UTF-8 [Định dạng chuyển đổi Unicode - 8-bit]
Unicode 16/32-bit [UCS-2/4] hoàn toàn không hiệu quả nếu tài liệu chủ yếu chứa các ký tự ASCII, vì mỗi ký tự chiếm hai byte dung lượng lưu trữ. Các sơ đồ mã hóa có độ dài thay đổi, chẳng hạn như UTF-8, sử dụng 1-4 byte để biểu thị một ký tự, được phát minh ra để cải thiện hiệu quả. Trong UTF-8, 128 ký tự US-ASCII thường được sử dụng chỉ sử dụng 1 byte, nhưng một số ký tự ít phổ biến hơn có thể yêu cầu tới 4 byte. Nhìn chung, hiệu quả được cải thiện đối với tài liệu chứa chủ yếu là văn bản US-ASCII
Việc chuyển đổi giữa Unicode và UTF-8 như sau
Trong UTF-8, các số Unicode tương ứng với các ký tự ASCII 7 bit được đệm bằng số 0 đứng đầu; . Do đó, UTF-8 có thể được sử dụng với tất cả các phần mềm sử dụng ASCII. Các số Unicode từ 128 trở lên, ít được sử dụng hơn, được mã hóa bằng nhiều byte hơn [2-4 byte]. UTF-8 thường yêu cầu ít bộ nhớ hơn và tương thích với ASCII. Hạn chế của UTF-8 là cần nhiều sức mạnh xử lý hơn để giải nén mã do độ dài thay đổi của nó. UTF-8 là định dạng phổ biến nhất cho Unicode
ghi chú
- UTF-8 sử dụng 1-3 byte cho các ký tự trong BMP [16-bit] và 4 byte cho các ký tự bổ sung bên ngoài BMP [21-bit]
- 128 ký tự ASCII [chữ cái Latinh cơ bản, chữ số và dấu chấm câu] sử dụng một byte. Hầu hết các ký tự Châu Âu và Trung Đông sử dụng chuỗi 2 byte, bao gồm các chữ cái Latinh mở rộng [có dấu ngã, macron, cấp tính, nghiêm trọng và các dấu khác], tiếng Hy Lạp, tiếng Armenia, tiếng Do Thái, tiếng Ả Rập và các ký tự khác. Tiếng Trung, tiếng Nhật và tiếng Hàn [CJK] sử dụng chuỗi ba byte
- Tất cả các byte, ngoại trừ 128 ký tự ASCII, có một bit
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
63 ở đầu. In other words, the ASCII bytes, with a leading1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
13 bit, can be identified and decoded easily
Thí dụ. 您好
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH65
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^02
UTF-16 [Định dạng chuyển đổi Unicode - 16-bit]
UTF-16 là lược đồ mã hóa ký tự Unicode có độ dài thay đổi, sử dụng từ 2 đến 4 byte. UTF-16 không được sử dụng phổ biến. Bảng biến đổi như sau
UnicodeUTF-16 CodeBytesxxxxxxxx xxxxxxxxGiống như UCS-2 - không mã hóa2000uuuuu zzzzyyyy yyxxxxxx[uuuuu≠0]110110ww wwzzzzyy 110111yy yyxxxxxx
[www = uuu - 1]4
Xin lưu ý rằng đối với 65536 ký tự trong BMP, UTF-16 giống với UCS-2 [2 byte]. Tuy nhiên, 4 byte được sử dụng cho các ký tự bổ sung bên ngoài BMP
Đối với các ký tự BMP, UTF-16 giống như UCS-2. Đối với các ký tự bổ sung, mỗi ký tự yêu cầu một cặp giá trị 16 bit, giá trị đầu tiên từ phạm vi ký tự thay thế cao, [
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH66], ký tự thứ hai từ phạm vi ký tự thay thế thấp [
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH67]
UTF-32 [Định dạng chuyển đổi Unicode - 32-bit]
Giống như UCS-4, sử dụng 4 byte cho mỗi ký tự - không được mã hóa
Các định dạng của Multi-Byte [e. g. , Unicode] Tệp văn bản
Độ bền [theo thứ tự byte]. Đối với một ký tự nhiều byte, bạn cần quan tâm đến thứ tự của các byte trong bộ nhớ. Trong big endian, byte quan trọng nhất được lưu trữ tại vị trí bộ nhớ có địa chỉ thấp nhất [byte lớn trước]. Trong little endian, byte quan trọng nhất được lưu trữ tại vị trí bộ nhớ có địa chỉ cao nhất [byte nhỏ trước]. Ví dụ: 您 [với số Unicode là
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH68] được lưu dưới dạng
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH69 trong big endian; . Big endian, tạo ra kết xuất hex dễ đọc hơn, được sử dụng phổ biến hơn và thường là mặc định
BOM [Dấu thứ tự byte]. BOM là một ký tự Unicode đặc biệt có mã số là
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH71, dùng để phân biệt big endian và little endian. Đối với big-endian, BOM xuất hiện dưới dạng
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH72 trong kho lưu trữ. Đối với little-endian, BOM xuất hiện dưới dạng
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH73. Unicode dự trữ hai số mã này để tránh bị trùng với ký tự khác
Các tệp văn bản Unicode có thể có các định dạng này
- Big Endian. UCS-2BE, UTF-16BE, UTF-32BE
- Little Endian. UCS-2LE, UTF-16LE, UTF-32LE
- UTF-16 với BOM. Ký tự đầu tiên của tệp là ký tự BOM, ký tự này chỉ định độ cuối. Đối với big-endian, BOM xuất hiện dưới dạng
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
72 trong kho lưu trữ. Đối với little-endian, BOM xuất hiện dưới dạng1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
73
Tệp UTF-8 luôn được lưu trữ dưới dạng big endian. BOM không đóng vai trò gì. Tuy nhiên, trong một số hệ thống [cụ thể là Windows], BOM được thêm làm ký tự đầu tiên trong tệp UTF-8 làm chữ ký để nhận dạng tệp dưới dạng mã hóa UTF-8. Ký tự BOM [
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH71] được mã hóa bằng UTF-8 thành
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH77. Không nên thêm BOM làm ký tự đầu tiên của tệp vì nó có thể bị hiểu sai trong hệ thống khác. Bạn có thể có tệp UTF-8 mà không cần BOM
Định dạng của tệp văn bản
Dấu phân cách dòng hoặc cuối dòng [EOL]. Đôi khi, khi bạn sử dụng Windows NotePad để mở một tệp văn bản [được tạo trong Unix hoặc Mac], tất cả các dòng được nối với nhau. Điều này là do các nền tảng điều hành khác nhau sử dụng ký tự khác nhau làm cái gọi là dấu phân cách dòng [hoặc cuối dòng hoặc EOL]. Hai ký tự điều khiển không in được có liên quan.
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH42 [Line-Feed hoặc LF] và
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH44 [Vận chuyển-Trả về hoặc CR]
- Windows/DOS sử dụng
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
80 [CR+LF hoặc "1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
49"] làm EOL - Unix và Mac chỉ sử dụng
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
42 [LF hoặc "1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
47"]
Cuối Tệp [EOF]. [LÀM]
Trang mã CMD của Windows
Lược đồ mã hóa ký tự [bộ ký tự] trong Windows được gọi là codepage. Trong trình bao CMD, bạn có thể ra lệnh
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH84 để hiển thị bảng mã hiện tại hoặc
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH85 để thay đổi bảng mã
lưu ý rằng
- Bảng mã mặc định 437 [được sử dụng trong DOS gốc] là một bộ ký tự 8 bit có tên là ASCII mở rộng, khác với Latin-1 cho các số mã trên 127
- Codepage 1252 [Windows-1252], không hoàn toàn giống với Latin-1. Nó gán mã số 80H đến 9FH cho các chữ cái và dấu chấm câu, chẳng hạn như dấu ngoặc đơn thông minh và dấu ngoặc kép. Một vấn đề phổ biến trong trình duyệt hiển thị dấu ngoặc kép và dấu nháy đơn trong dấu chấm hỏi hoặc hộp là do trang được cho là Windows-1252 nhưng lại bị dán nhãn sai thành ISO-8859-1
- Để quốc tế hóa và bộ ký tự tiếng Trung. bảng mã 65001 cho UTF8, bảng mã 1201 cho UCS-2BE, bảng mã 1200 cho UCS-2LE, bảng mã 936 cho các ký tự tiếng Trung trong GB2312, bảng mã 950 cho các ký tự tiếng Trung trong Big5
Bộ chữ Hán
Unicode hỗ trợ tất cả các ngôn ngữ, kể cả các ngôn ngữ châu Á như tiếng Trung [cả chữ giản thể và phồn thể], tiếng Nhật và tiếng Hàn [gọi chung là CJK]. Có hơn 20.000 ký tự CJK trong Unicode. Các ký tự Unicode thường được mã hóa theo sơ đồ UTF-8, thật không may, yêu cầu 3 byte cho mỗi ký tự CJK, thay vì 2 byte trong UCS-2 [UTF-16] không được mã hóa
Tệ hơn nữa, còn có nhiều bộ chữ Trung Quốc khác nhau, không tương thích với Unicode
- GB2312/GBK. đối với chữ Hán giản thể. GB2312 sử dụng 2 byte cho mỗi ký tự tiếng Trung. Bit quan trọng nhất [MSB] của cả hai byte được đặt thành 1 để cùng tồn tại với ASCII 7 bit với MSB là 0. Có khoảng 6700 ký tự. GBK là phần mở rộng của GB2312, bao gồm nhiều ký tự hơn cũng như các ký tự tiếng Trung phồn thể
- 5 LỚN. đối với các ký tự tiếng Trung phồn thể, BIG5 cũng sử dụng 2 byte cho mỗi ký tự tiếng Trung. Bit quan trọng nhất của cả hai byte cũng được đặt thành 1. BIG5 không tương thích với GBK, tôi. e. , the same code number is assigned to different character
Ví dụ, thế giới trở nên thú vị hơn với nhiều tiêu chuẩn này
StandardCharactersCodesSimplifiedGB2312和谐BACD D0B3UCS-2和谐548C 8C10UTF-8和谐E5928C E8B090TraditionalBIG5和諧A94D BFD3UCS-2和諧548C 8AE7UTF-8和諧E5928C E8ABA7Ghi chú cho người dùng CMD của Windows. Để hiển thị chính xác ký tự tiếng Trung trong shell CMD, bạn cần chọn đúng bảng mã, e. g. , 65001 cho UTF8, 936 cho GB2312/GBK, 950 cho Big5, 1201 cho UCS-2BE, 1200 cho UCS-2LE, 437 cho DOS gốc. Bạn có thể sử dụng lệnh "
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH86" để hiển thị trang mã hiện tại và lệnh "
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH87" để thay đổi trang mã. Bạn cũng phải chọn một phông chữ có thể hiển thị các ký tự [e. g. , Courier New, Consolas hoặc Lucida Console, KHÔNG phải phông chữ Raster]
Trình tự đối chiếu [đối với nhân vật xếp hạng]
Một chuỗi bao gồm một dãy các ký tự viết hoa hoặc viết thường, e. g. ,
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH88,
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH89,
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH90. Khi sắp xếp hoặc so sánh các chuỗi, nếu chúng ta sắp xếp các ký tự theo các số mã bên dưới [e. g. , US-ASCII] theo từng ký tự, thứ tự ví dụ sẽ là
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH89,
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH88,
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH90 vì chữ in hoa có số mã nhỏ hơn chữ in thường. Điều này không phù hợp với cái gọi là thứ tự từ điển, trong đó các chữ hoa và chữ thường có cùng thứ hạng. Một vấn đề phổ biến khác trong việc sắp xếp chuỗi là
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH94 [mười] lần được sắp xếp trước
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH95 đến
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH96
Do đó, khi sắp xếp hoặc so sánh các chuỗi, cái gọi là chuỗi đối chiếu [hoặc đối chiếu] thường được xác định, chỉ định thứ hạng cho các chữ cái [chữ hoa, chữ thường], số và ký hiệu đặc biệt. Có nhiều trình tự đối chiếu có sẵn. Việc chọn trình tự đối chiếu hoàn toàn tùy thuộc vào bạn để đáp ứng các yêu cầu cụ thể của ứng dụng của bạn. Một số trình tự đối chiếu thứ tự từ điển không phân biệt chữ hoa chữ thường có cùng thứ hạng cho cùng một chữ hoa và chữ thường, i. e. ,
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]3,
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]1 ⇒
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH99,
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r000 ⇒. ⇒
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH06,
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH10. Một số trình tự đối chiếu thứ tự từ điển phân biệt chữ hoa chữ thường đặt chữ cái viết hoa trước chữ cái viết thường của nó, i. e. ,
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]3 ⇒
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH99 ⇒
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r005. ⇒
To convert 261[base 10] to hexadecimal: 261/16 => quotient=16 remainder=5 16/16 => quotient=1 remainder=0 1/16 => quotient=0 remainder=1 [quotient=0 stop] Hence, 261D = 105H [Collect the hex digits from the remainder in reverse order]1 ⇒
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r007. Thông thường, khoảng trắng được xếp trước các chữ số
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH13 đến
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH14, theo sau là các bảng chữ cái
Trình tự đối chiếu thường phụ thuộc vào ngôn ngữ, vì các ngôn ngữ khác nhau sử dụng các bộ ký tự khác nhau [e. g. , á, é, a, α] có mệnh lệnh riêng
Dành cho Lập trình viên Java - dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
10
JDK 1. 4 đã giới thiệu gói
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r011 mới để hỗ trợ mã hóa/giải mã các ký tự từ UCS-2 được sử dụng nội bộ trong chương trình Java sang bất kỳ bộ ký tự được hỗ trợ nào được sử dụng bởi các thiết bị bên ngoài
Thí dụ. Chương trình sau mã hóa một số văn bản Unicode trong sơ đồ mã hóa khác nhau và hiển thị mã Hex của chuỗi byte được mã hóa
Dành cho Lập trình viên Java - dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
12 và dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
13
The
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r012 data type are based on the original 16-bit Unicode standard called UCS-2. The Unicode has since evolved to 21 bits, with code range of U+0000 to U+10FFFF. The set of characters from U+0000 to U+FFFF is known as the Basic Multilingual Plane [BMP]. Characters above U+FFFF are called supplementary characters. A 16-bit Java
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r012 cannot hold a supplementary character
Recall that in the UTF-16 encoding scheme, a BMP characters uses 2 bytes. It is the same as UCS-2. A supplementary character uses 4 bytes. and requires a pair of 16-bit values, the first from the high-surrogates range, [
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH66], the second from the low-surrogates range [
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH67]
In Java, a
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r013 is a sequences of Unicode characters. Java, in fact, uses UTF-16 for
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r013 and
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r020. For BMP characters, they are the same as UCS-2. For supplementary characters, each characters requires a pair of
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r012 values
Java methods that accept a 16-bit
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r012 value does not support supplementary characters. Methods that accept a 32-bit
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r023 value support all Unicode characters [in the lower 21 bits], including supplementary characters
This is meant to be an academic discussion. I have yet to encounter the use of supplementary characters
Displaying Hex Values & Hex Editors
At times, you may need to display the hex values of a file, especially in dealing with Unicode characters. A Hex Editor is a handy tool that a good programmer should possess in his/her toolbox. There are many freeware/shareware Hex Editor available. Try google "Hex Editor"
I used the followings
- NotePad++ with Hex Editor Plug-in. Open-source and free. You can toggle between Hex view and Normal view by pushing the "H" button
- PSPad. Freeware. Bạn có thể chuyển sang chế độ xem Hex bằng cách chọn menu "View" và chọn "Hex Edit Mode"
- TextPad. Shareware without expiration period. To view the Hex value, you need to "open" the file by choosing the file format of "binary" [??]
- UltraEdit. Shareware, not free, 30-day trial only
Let me know if you have a better choice, which is fast to launch, easy to use, can toggle between Hex and normal view, free,
The following Java program can be used to display hex code for Java Primitives [integer, character and floating-point]
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^03
In Eclipse, you can view the hex code for integer primitive Java variables in debug mode as follows. Trong phối cảnh gỡ lỗi, bảng "Biến" ⇒ Chọn "menu" [tam giác ngược] ⇒ Java ⇒ Tùy chọn Java. ⇒ Primitive Display Options ⇒ Check "Display hexadecimal values [byte, short, char, int, long]"
Summary - Why Bother about Data Representation?
Integer number
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06, floating-point number
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r025 character symbol
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH63, and string
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH95 are totally different inside the computer memory. Bạn cần biết sự khác biệt để viết chương trình tốt và hiệu suất cao
- Trong số nguyên có dấu 8 bit, số nguyên
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
6 được biểu diễn dưới dạngdn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
29 - In 8-bit unsigned integer, integer number
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
6 is represented asdn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
29 - Trong số nguyên có dấu 16 bit, số nguyên
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
6 được biểu diễn dưới dạngdn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
33 - In 32-bit signed integer, integer number
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
6 is represented asdn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
35dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
35dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
33 - In 32-bit floating-point representation, number
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
25 is represented asdn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
39, i. e. ,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
09,dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
41,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
08 - Trong biểu diễn dấu phẩy động 64-bit, số
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
25 được biểu diễn dưới dạngdn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
44, i. e. ,A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^0
09,dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
46,A3C5H = 1010 0011 1100 0101B 102AH = 0001 0000 0010 1010B
08 - Trong 8-bit Latin-1, ký hiệu ký tự
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
63 được thể hiện dưới dạngdn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
49 [hoặcdn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
50] - Trong UCS-2 16-bit, ký hiệu ký tự
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
63 được biểu diễn dưới dạngdn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
52 - Trong UTF-8, ký hiệu ký tự
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH
63 được biểu diễn dưới dạngdn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r0
49
Nếu bạn "thêm" một số nguyên có dấu 16 bit
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^06 và ký tự Latin-1
1001001010B = 0010 0100 1010B = 24AH 10001011001011B = 0010 0010 1100 1011B = 22CBH63 hoặc một chuỗi
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r057, bạn có thể nhận được một bất ngờ
Bài tập [Biểu diễn dữ liệu]
Đối với các mã 16 bit sau
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^04
Give their values, if they are representing
- a 16-bit unsigned integer;
- một số nguyên có dấu 16 bit;
- hai số nguyên không dấu 8 bit;
- hai số nguyên có dấu 8 bit;
- ký tự Unicode 16 bit;
- hai ký tự ISO-8859-1 8 bit
trả lời. [1]
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r058,
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r059; [2]
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r058,
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r061; [3]
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05,
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r058;
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r064,
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r058; [4]
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^05,
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r058;
A3EH = A00H + 30H + EH = 10×16^2 + 3×16^1 + 14×16^000,
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r058; [5]
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r070;
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r071; [6]
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r072,
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r070;
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r074,
dn-1×rn-1 + dn-2×rn-2 + .. + d1×r1 + d0×r070