我不明白在这种一元运算符的组合中到底发生了什么。我知道当你输入它的时候,它最终会产生最小的带符号字符值,我不明白的是它到底是怎么回事。
我认为解决方案是========================================================================
~是一个一元运算符,它实际上表示与逻辑操作数'NOT‘相同,对吗?
那么,不使用char意味着什么?char中的所有内容都减少到0吗?
字符不会转换为未签名的字符吗?
然后我们将字符转换为unsigned,但是所有不是0的字符都被移动了2^1,因为>> 1和做2^1是一样的,对吗?
========================================================================
#include <stdio.h>
int main(){
printf("signed char min = %d\n", ~(char)((unsigned char) ~0 >> 1));
return 0;
}
它产生最小的带符号字符,这是有效的,但我只想知道在引擎盖下发生了什么,因为它不完全清楚。
发布于 2019-03-29 11:14:34
~
不是逻辑NOT,而是逐位NOT,因此它独立地翻转每一位。
~0
全部为1位,将其转换为无符号字符并向右移位一次,则第一位为0。转换为带符号字符并应用按位NOT将使第一位为1,其余为0,这是一个two's complement整数的最小值(这里假设使用的是2的补码,这不受标准的保证)。
发布于 2019-03-29 08:42:17
这段代码看起来很眼熟,所以我搜索了我的旧邮件,找到了这个宏:
#define MSB(type) (~(((unsigned type)-1)>>1))
在马克·S·布拉德的.signature中。
它返回一个指定整数类型的值,该值的位除最高有效位外均为零。
(unsigned char)-1
生产#FF(#FF)>>1
生产#7F~(#7F)
生产#80对于给定的类型,#80恰好是最小的负值(尽管在理论上C不需要使用2s补码来存储负整数)。
编辑:
最初的MSB( type )旨在产生一个赋值给"type“类型的变量。
正如@chux指出的那样,如果在其他上下文中使用它,它可以向左扩展额外的位。
更正确的版本是:
#define MSB(type) ((unsigned type)~(((unsigned type)-1)>>1))
https://stackoverflow.com/questions/55408783
复制相似问题