Cách biểu diễn số âm trong máy tính (phương pháp Bù 2)

Thông báo chuẩn bị xuất bản khóa học mới “Lập Trình Zalo với Android SDK”:https://duythanhcse.wordpress.com/2020/05/09/thong-bao-chuan-bi-xuat-ban-khoa-hoc-moi-lap-trinh-zalo-voi-android-sdk/

Các kiến thức trong Khóa học “Lập Trình Zalo với Android SDK” gồm:

– Tìm hiểu Zalo Android SDK (cách tích hợp, login, Open API, tương tác với Zalo App…)

– Cung cấp những kiến thức cốt lõi cơ bản về 1 ứng dụng tích hợp Zalo Android SDK.

-Cách thức gửi xét duyệt sử dụng các API

– Cách thức đăng nhập, xác thực, đăng xuất Zalo

– Làm việc với Social API (Mời sử dụng ứng dụng, đăng bài viết, gửi tin nhắn bạn bè, lấy danh sách bạn bè, lấy thông tin người dùng)

Để 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 http://duythanhcse.wordpress.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.

23 thoughts on “Cách biểu diễn số âm trong máy tính (phương pháp Bù 2)”

  1. 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;

  2. “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

  3. 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

    1. 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

      1. 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?

      2. 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

  4. 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

  5. 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

  6. 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)!!!

  7. 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 ?

Leave a Reply