尝试同时回答原始问题中的显式问题(什么是CHAR_BIT)和隐式问题(这是如何工作的)。
C和C ++中的char表示C程序可以寻址的最小内存单元*
C和C ++中的CHAR_BIT表示char中的位数。由于对char类型的其他要求,它必须始终至少为8。实际上,在所有现代通用计算机上,它恰好是8,但是某些历史或专业系统可能具有更高的价值。
Java没有CHAR_BIT或sizeof的等效项,因此没有必要,因为Java中的所有原始类型都是固定大小的,并且对象的内部结构对程序员来说是不透明的。如果将此代码转换为Java,则只需将“ sizeof(int)* CHAR_BIT-1”替换为固定值31。
在此特定代码中,它用于计算int中的位数。请注意,此计算假定int类型不包含任何填充位。
假设您的编译器选择对有符号数的位移位进行符号扩展,并且假设您的系统对负数使用2s补码表示,则这意味着“ MASK”对于正值或零值将为0,对于负值将为-1。
要使二进制补码取反,我们需要按位取非,然后加一个。等效地,我们可以减去一个,然后按位取反。
再次假设二进制补码表示-1由全1表示,因此异或与-1等效于按位求反。
因此,当v为零时,该数字将保留,而当v为1时,该数字将被取反。
需要注意的是,C和C ++中的签名溢出是未定义的行为。因此,对最大负值使用此ABS实现会导致不确定的行为。可以通过添加强制转换来解决此问题,以使程序的最后一行以unsigned int形式求值。
*通常与硬件可以寻址的最小内存单元相同,但在本质上并不相同。一种实现方式可能会将多个硬件可寻址存储器单元组合成一个程序可寻址存储器单元,或者将一个硬件可寻址存储器单元拆分成多个可程序编程存储器单元。