Thắc mắc về kiểu số nguyên có dấu

Em là tân sinh viên ngành công nghệ thông tin. Theo thời khóa biểu là qua tháng 11, trường mới bắt đầu dạy nhập môn lập trình nên giờ em tự học trước. Em đọc đến tài liệu đến đoạn:
“Sử dụng bit bên trái nhất để làm bit dấu. Nếu gán giá trị >32767 cho biến có 1 trong 3 kiểu enum, short int, int thì giá trị của biến này có thể là số âm”.
Em không hiểu ở chỗ đó lắm, tại sao giá trị >32767 thì giá trị của biến có thể là số âm ạ? Và sử dụng bit bên trái nhất để làm bit dấu là sao ạ?
Em cảm ơn.

BĐT chuẩn:

1 <= sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
// representable requirement, N1570 5.2.4.2.1
sizeof(short) >= 16 bits
sizeof(int) >= 16 bits
sizeof(long) >= 32 bits
sizeof(long long) >= 64 bits

Nếu số quá lớn so với kiểu thì sẽ bị cắt phần bit cao và có thể hiện lên số âm :slight_smile: do bit cao nhất là 1 thì là số âm.

4 Likes

Tôi không rõ bạn đang học ngôn ngữ lập trình nào. Nhưng tổng quát thì có thể hiểu thế này:

Đối với các giá trị kiểu int (và enum và short int theo bạn nói) trong trường hợp này, hệ thống sẽ dùng 2 bytes hay 16 bits để lưu trữ và xử lý.

Như vậy, vì mỗi bit có thể có một trong hai giá trị 1 hoặc 0, nên 16 bit có thể dùng để biểu diễn tối đa 2^16 (2 lũy thừa 16) hay là 65536 giá trị khác nhau.

Nếu các giá trị này hoàn toàn là các số nguyên dương, thì các giá trị này sẽ tương ứng với dãy số từ 0 đến 65535.

Nhưng trong trường hợp chúng ta muốn sử dụng các 16 bits này để biểu diễn cả các số âm, thì chúng ta sẽ quy ước dùng bit phía trái nhất (left most) để đại diện cho dấu, như vậy sẽ có hai khả năng như sau:

1xxx xxxx xxxx xxxx trong trường hợp số âm và
0xxx xxxx xxxx xxxx trong trường hợp số dương

Như vậy chúng ta chỉ còn 15 bit còn lại để xác định giá trị tương ứng với từ 0 đến 32767 (hay là 2^15). Do đó, nếu bạn chỉ dùng các số từ 0 đến 32767 tương ứng với dãy số nhị phân từ
0000 0000 0000 0000 đến 0111 1111 1111 1111 thì chắc chắn đó là số dương. Nhưng nếu bạn dùng số lớn hơn thì bit đầu tiên sẽ là 1 và tương ứng với dãy số nhị phân từ
1000 0000 0000 0000 đến 1111 1111 1111 1111 thì nó có thể hiểu là số âm hoặc dương tùy trường hợp. Đó cũng là lý do tại sao bạn thấy có các kiểu int, signed intunsigned int như trong trường hợp của C/C++

4 Likes

Hi Bé Một Tuổi.
Bạn học lý thuyết trước đã.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?