Để biểu diễn số Âm trong máy tính thông thường người ta sử dụng phương pháp Bù 2.
Topic này được viết để bổ sung kiến thức cho Topic https://tranduythanh.com/2012/01/01/cac-vi-d%E1%BB%A5-v%E1%BB%81-java-assignment-operator/ (Java Assignment Operator)
Theo phương pháp này, bit cực trái hay còn gọi là bit nằm bên trái cùng của byte được sử dụng làm bit dấu ( là bit tượng trung cho dấu của số – sign bit). Người ta quy ước: Nếu bit dấu là 0 thì số là số dương, nếu bit dấu là 1 thì số là số âm. Ngoài bit dấu này ra, các bit còn lại được dùng để biểu diễn độ lớn của số.
Ví dụ 1:
Tôi lấy số -45 ở hệ thập phân, số này sẽ được biểu diễn trong máy tính theo phương pháp bù 2 như sau ( Tôi chọn mẫu 8 bit):
Bước 1: Xác định số nguyên 45 ở hệ thập phân được biểu diễn trong máy tính là : 0010 1101
Bước 2: Đảo tất cả các bit nhận được ở bước 1. Kết quả bạn sẽ được: 1101 0010
Bước 3: Cộng thêm 1 vào kết quả thu được ở bước 2. Kết quả sau khi cộng: 1101 0011
Bước 4: Vì là biểu diễn số âm nên bit cực trái luôn giữ là 1.
Vậy với phương phá bù 2, số -45 ở hệ thập phân được biểu diễn trong máy tính như sau: 1101 0011
Ví dụ 2:
Tôi lấy số nguyên -5 ở hệ thập phân, nó sẽ được biểu diễn trong máy tính theo phương pháp bù 2 như sau ( cũng lấy mẫu 8 bit):
Bước 1: Xác định số nguyên 5 ở hệ thập phân được biểu diễn dạng nhị phân trong máy tính như sau: 0000 0101
Bước 2: Đảo tất cả các bit nhận được ở bước 1. Ta được như sau: 1111 1010
Bước 3: Cộng thêm 1 vào kết quả thu được ở bước 2, ta được: 1111 1011.
Bước 4: Vì là biểu diễn số âm nên bit cực trái luôn giữ là 1
Như vậy với phương pháp bù 2 thì số -5 ở hệ thập phân được biểu diễn trong máy tính như sau: 1111 1011
Để giúp các bạn hiểu rõ hơn, Tôi sẽ thực hiện 2 phép cộng số thập phân âm (<0) cho các bạn xem:
Ví dụ 3: Cộng số -5 với số 2 (mẫu 8 bit):
Trước tiên bạn phải đổi -5 thành số nhị phân trong máy tính theo phương pháp Bù 2. Tức là bạn sẽ có số 1111 1011
Số 2 bạn biểu diễn thành nhị phân, bạn cũng sẽ được 0000 0010
Bây giờ Tôi sẽ cộng 2 số nhị phân này lại như sau:
1 1 1 1 1 0 1 1
+
00 00 0 0 1 0
———————-
1 1 1 1 1 1 0 1
Bây giờ tự nhiên Tôi hỏi bạn, số nhị phân 1 1 1 1 1 1 0 1 thì số thập phân của nó là số mấy? Bạn sẽ trả lời như thế nào? Trước tiến phải xác định nó là số Âm bởi vì bit cực trái của nó là số 1. Để biết nó là số mấy thì ta tiến hành đảo bit như sau:
1 1 1 1 1 1 0 1 => 00000010
Tiến hành cộng thêm 1 vào 00000010, như vậy ta được 00000011. Ta đổi qua hệ thập phân = 2^1 +2^0 =2+1 =3, cộng với dấu đằng trước của nó là dấu Âm, do đó 1 1 1 1 1 1 0 1 sẽ có giá trị là -3
Ví dụ 4: Tôi sẽ cộng số -5 với -7 (cũng dùng mẫu 8 bit)
Cũng dùng phương pháp bù 2 để biểu diệ n-5 và -7 thành số nhị phân, Số -5 bạn đã biết nó có giá trị 1111 1011. Còn số -7 nếu bạn chưa biết biểu diễn thì bạn chưa hiểu cách tính, bạn phải coi lại 4 bước bên trên. Coi lại mà chưa hiểu tiếp thì chắc ăn Tôi sẽ biểu diện lại cho bạn xem bên dưới:
Bước 1: Xác định số nguyên 7 bên hệ thập phân được biểu diễn sang nhị phân là: 0000 0111
Bước 2: Đảo tất cả các bit nhận được từ bước 1, ta sẽ được: 1111 1 000
Bước 3: Cộng 1 vào kết quả nhận được ở bước 2, ta được: 1111 1001
Bước 4: Vì là số âm nên bit cực trái là 1
Như vậy số -7 được biểu diễn đưới dạng nhị phân trong máy tính là: 1111 1001
Bây giờ ta tiến hành Cộng -5 và -7
1111 1011
+
1111 1001
—————–
1111 0100
Bạn để ý rằng, khi cộng 2 bit cực trái của 2 số trên, ta vẫn còn nhớ 1, Nhưng mà trong kết quả này ta bỏ bit dấu này đi
Bây giờ cũng tương tự, Tôi hỏi lại các bạn số nhị phân 1111 0100 thì số thập phân của nó là bao nhiêu?
Tôi sẽ một lần nữa làm lại cho các bạn: Tiến hành đảo bit 1111 0100 bạn sẽ được 0000 1011 , sau đó cộng 1 vào ta được 0000 1100
Như vậy bạn sẽ được 2^3+ 2^2 =8+4=12, với bit dấu là âm, Tức là ta được kết quả -12.
Chúc các bạn Thành Công.
ban ơi giải không chuẩn rồi, minh lay vi du cho ban nhe: 4-3 dung 8 bit mo noi nhe ban xe thay bi sai so voi khi ban nói kết quả cuối cúng là : 1111.1111 theo như cách giải thích của bạn thì đây là số âm đúng koong
ta đi đảo bít ra kết quả: 0000 0000 sau đó công thêm một 0000 0001 đây là kết quả cuối cung theo như cách giải thích thì nó là số âm nhỉ? vậy 4-3=-1;
Bạn chưa hiểu vấn đề bài toán. Hãy tính lại đúng bước. Có thể bạn chưa thành thạo cách cộng bit nên mới ra 1 nùi 1111.1111
4-3 :(0000 0100 + 1111 1101=0000 0001 “số lày là số dương>> kq=1”)
“Bạn để ý rằng, khi cộng 2 bit cực trái của 2 số trên, ta vẫn còn nhớ 1, Nhưng mà trong kết quả này ta bỏ bit dấu này đi” cho mình hỏi :tại sao ta lại bỏ bít dấu này. thanks
ko biết số 00000001 sang số thập phân là bao nhiêu ta. ban nào biết chỉ dùm mình vs??
dạ là 1
bạn ơi cho mình hỏi khi nào thì kết quả cua phép cộng hoặc trừ được giữ nguyên rui` đổi ra thập phân và khi nào thì kết quả chuyển qua bù 2 rùi mới chuyển qua thập phân?
thanks
Khi nhận thấy nó là số dương rồi thì giữ nguyên, khi nó là số âm thì chuyển lại qua bù 2 tính thập phân
Khi nhận thấy nó là số dương rồi thì giữ nguyên, khi nó là số âm thì chuyển lại qua bù 2 tính thập phân
Bạn giải bài cộng (-3) với (-4), độ dài 4bit hộ mình với ^_^ tks
4 –> 0100 vậy -4 là 1100 tương tự -3 là 1101 -4 + -3 =(1100+1101)=11001 do sử dụng 4 bit thôi nên bit 1 đầu tiên bên trái bạn bỏ đi thành 1001 vì bit đầu tiên là bit 1 nên chắc chắn là số âm và muốn biết nó là số âm gì bạn đảo bit rồi cộng thêm 1 thì kết quả sẽ là : 1001 đảo bit thành 0110 cộng 1 thành 0111 –>7. Vì nó là số âm nên kết quả sẽ là -7
Giải thích giúp mình tại sao trong eclipse khi mình dùng phép bù thì kq lại ra thế này, ví dụ:
System.out.println(~1) (kq=-2), System.out.println(~2) (kq=-3)…
=> KL: = – (số được bù + 1) (?)
Không biết là nó dùng bù 1 hay bù 2. Và cho mình hỏi thêm tại sao lúc lại dùng mẫu 8 bit lúc lại dùng 4 bit?
có lẽ bạn đã hiểu sai về dấu ~ trong java
dấu ~ tương đương với NOT
nghĩa là chỉ đảo bit
còn dấu trừ (-n) đảo bit n rùi cộng thêm 1
ví dụ
so 1 -> nhiphan: 0001 khi thêm ~1 sẽ là 1110
Chuyển 1110 về số thập phân -> đảo bít rùi cộng 1 = 0010 bằng 2
nó khác hoàn toàn với bạn dùng
phép bù trừ (-1) -> chuyển số 1 sang nhị phân 0001
vì là số âm nên đảo bit rùi cộng 1
đảo bit : = 1110
cộng 1: = 1111
theo chuẩn IEEE754/85 biểu diễn số thực độ chính xác đơn (32 bit) thì số bit dùng biểu diễn phần mã lệnh( e) là ? bạn trả lời gúp mình nha
Xác dịnh giá trị thập phân của sồ thực X có dạng biểu diễn theo chuẩn IEEE 754 với 32 bit như sau :00111111100000000000000000000000
Thầy ơi cho e hỏi :
Người ta xác định số âm dựa vào bit cực trái, do vậy một số nguyên 8 bit sẽ được dành riêng 1 bit cực trái làm dấu hiệu nhận biết âm (1)/dương (0). Như vậy giới hạn biểu diễn của một số 8 bit chỉ nằm trong dải từ [-127, 126] thôi phải không ạ? (tức là giá trị tuyệt đối của nó được xác định bằng 7 bit sau còn lại).
Do vậy để biểu diễn một số có trị tuyệt đối trên 7 bit chẳng hạn 210 (có 8 bit 1101 0010) thì ta không thể sử dụng 8 bit để biểu diễn được phải không ạ? (bởi khi đó bit cực trái của nó là 1, thì trả biết nó là số âm hay số dương :D)!!!
cái này chính là vấn đề mình cũng đang thắc mắc
Thưa thầy cho em hỏi là khi em đổi số 01110111.
Đầu tiên đảo bit là 10001000, xong +1 được 10001001 —> 137.
Mà giới hạn biểu diễn số bù 2 với 8 bit là -128 đến 127 cơ mà.
Sao số 01110111 cũng 8bit mà lại đổi ra 137 ?
thầy ơi, có thể biểu diễn số thực âm được không??
sao lúc chuyển từ thập phân sang nhị phân cộng 1 mà lúc chuyển ngược lại cũng vẫn cộng 1, ở ví dụ 4
cho e hỏi là nếu la 16 bit thì cũng tương tự như vậy ạ
Vì sao phải cộng thêm 1