首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >~( char) ((unsigned Char) ~0 >> 1)到底发生了什么?

~( char) ((unsigned Char) ~0 >> 1)到底发生了什么?
EN

Stack Overflow用户
提问于 2019-03-29 08:23:38
回答 2查看 104关注 0票数 1

我不明白在这种一元运算符的组合中到底发生了什么。我知道当你输入它的时候,它最终会产生最小的带符号字符值,我不明白的是它到底是怎么回事。

我认为解决方案是========================================================================

~是一个一元运算符,它实际上表示与逻辑操作数'NOT‘相同,对吗?

那么,不使用char意味着什么?char中的所有内容都减少到0吗?

字符不会转换为未签名的字符吗?

然后我们将字符转换为unsigned,但是所有不是0的字符都被移动了2^1,因为>> 1和做2^1是一样的,对吗?

========================================================================

代码语言:javascript
复制
#include <stdio.h>

int main(){
printf("signed char min = %d\n", ~(char)((unsigned char) ~0 >> 1)); 

return 0;
}

它产生最小的带符号字符,这是有效的,但我只想知道在引擎盖下发生了什么,因为它不完全清楚。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-29 11:14:34

~不是逻辑NOT,而是逐位NOT,因此它独立地翻转每一位。

~0全部为1位,将其转换为无符号字符并向右移位一次,则第一位为0。转换为带符号字符并应用按位NOT将使第一位为1,其余为0,这是一个two's complement整数的最小值(这里假设使用的是2的补码,这不受标准的保证)。

票数 1
EN

Stack Overflow用户

发布于 2019-03-29 08:42:17

这段代码看起来很眼熟,所以我搜索了我的旧邮件,找到了这个宏:

代码语言:javascript
复制
#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指出的那样,如果在其他上下文中使用它,它可以向左扩展额外的位。

更正确的版本是:

代码语言:javascript
复制
#define MSB(type) ((unsigned type)~(((unsigned type)-1)>>1))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55408783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档