Cố gắng trả lời cả câu hỏi rõ ràng (CHAR_BIT là gì) và câu hỏi ngầm (cách này hoạt động như thế nào) trong câu hỏi ban đầu.
Một ký tự trong C và C ++ đại diện cho đơn vị bộ nhớ nhỏ nhất mà chương trình C có thể xử lý *
CHAR_BIT trong C và C ++ đại diện cho số lượng bit trong một ký tự. Nó luôn phải có ít nhất 8 do các yêu cầu khác về loại ký tự. Trên thực tế, trên tất cả các máy tính đa năng hiện đại, nó chính xác là 8 nhưng một số hệ thống lịch sử hoặc chuyên dụng có thể có giá trị cao hơn.
Java không có CHAR_BIT hoặc sizeof tương đương, không cần nó vì tất cả các kiểu nguyên thủy trong Java đều có kích thước cố định và cấu trúc bên trong của các đối tượng là không rõ ràng đối với người lập trình. Nếu dịch mã này sang Java, bạn chỉ cần thay thế "sizeof (int) * CHAR_BIT - 1" bằng giá trị cố định 31.
Trong mã cụ thể này, nó đang được sử dụng để tính số bit trong một int. Lưu ý rằng phép tính này giả định rằng kiểu int không chứa bất kỳ bit đệm nào.
Giả sử rằng trình biên dịch của bạn chọn ký mở rộng trên sự thay đổi bit của các số có dấu và giả sử hệ thống của bạn sử dụng biểu diễn bổ sung 2s cho các số âm, điều này có nghĩa là "MASK" sẽ là 0 cho giá trị dương hoặc 0 và -1 cho giá trị âm.
Để phủ định một số bổ sung hai phần, chúng ta cần thực hiện bitwise not và sau đó thêm một số. Tương tự, chúng ta có thể trừ đi một và sau đó phủ định bitwise.
Một lần nữa, giả sử biểu diễn bổ sung hai phần -1 được biểu diễn bởi tất cả những cái, vì vậy loại trừ hoặc với -1 là tương đương với phủ định bit.
Vì vậy, khi v bằng 0, số đó được để lại một mình, khi v là một thì nó bị phủ định.
Một điều cần lưu ý là tràn đã ký trong C và C ++ là hành vi không xác định. Vì vậy, việc sử dụng triển khai ABS này trên giá trị âm nhất dẫn đến hành vi không xác định. Điều này có thể được khắc phục bằng cách thêm các phôi sao cho dòng cuối cùng của chương trình được đánh giá trong int unsigned.
* Thường nhưng không giống đơn vị bộ nhớ nhỏ nhất mà phần cứng có thể xử lý. Việc triển khai có khả năng kết hợp nhiều đơn vị bộ nhớ địa chỉ phần cứng thành một đơn vị bộ nhớ địa chỉ chương trình hoặc chia một đơn vị bộ nhớ địa chỉ phần cứng thành nhiều đơn vị bộ nhớ có thể bổ sung theo chương trình.