원래 질문의 명시 적 질문 (CHAR_BIT은 무엇인가)과 암시 적 질문 (이 작동 방식)에 모두 답하려고합니다.
C 및 C ++의 문자는 C 프로그램이 처리 할 수있는 가장 작은 메모리 단위를 나타냅니다. *
C 및 C ++의 CHAR_BIT는 문자의 비트 수를 나타냅니다. char 유형에 대한 다른 요구 사항으로 인해 항상 8 이상이어야합니다. 실제로 모든 최신 범용 컴퓨터에서는 정확히 8 개이지만 일부 역사적 또는 전문 시스템은 더 높은 값을 가질 수 있습니다.
Java는 CHAR_BIT 또는 sizeof와 동등하지 않으며 Java의 모든 기본 유형이 고정 크기이고 객체의 내부 구조가 프로그래머에게 불투명하므로 필요하지 않습니다. 이 코드를 Java로 변환하는 경우 "sizeof (int) * CHAR_BIT-1"을 고정 값 31로 간단히 바꿀 수 있습니다.
이 특정 코드에서는 int의 비트 수를 계산하는 데 사용됩니다. 이 계산은 int 유형에 패딩 비트가 포함되어 있지 않다고 가정합니다.
컴파일러가 부호있는 숫자의 비트 시프트에서 부호 확장을 선택하고 시스템이 음수에 대해 2의 보수 표현을 사용한다고 가정하면 "MASK"는 양수 또는 0 값에 대해 0이고 음수 값에 대해 -1이됩니다.
2의 보수 수를 부정하려면 비트 not을 수행 한 다음 1을 더해야합니다. 동등하게 우리는 1을 뺀 다음 비트로 부정 할 수 있습니다.
다시 2의 보수 표현 -1이 모두 1로 표현된다고 가정하면 배타적 또는 -1은 비트 부정과 동등합니다.
따라서 v가 0이면 숫자는 그대로 남아 있고 v가 1이면 부정됩니다.
주의해야 할 점은 C 및 C ++의 서명 된 오버플로가 정의되지 않은 동작입니다. 따라서 가장 부정적인 값에이 ABS 구현을 사용하면 정의되지 않은 동작이 발생합니다. 프로그램의 마지막 줄이 unsigned int로 평가되도록 캐스트를 추가하여이 문제를 해결할 수 있습니다.
* 일반적으로 하드웨어가 처리 할 수있는 가장 작은 메모리 단위와 동일하지는 않습니다. 구현은 잠재적으로 하드웨어 주소 지정 가능 메모리의 여러 단위를 프로그램 주소 지정 가능 메모리의 한 단위로 결합하거나 하드웨어 주소 지정 가능 메모리의 한 단위를 프로그램 추가 가능 메모리의 여러 단위로 분할 할 수 있습니다.