【问题标题】:Why does the "~" operator on a char result in more bytes? [duplicate]为什么 char 上的“~”运算符会产生更多字节? [复制]
【发布时间】:2021-01-20 09:15:49
【问题描述】:

我被下面的代码弄糊涂了:

char c = 0x66;
printf("~c = %x\n", ~c); //0xffffff99
printf("size of c: %d\n", sizeof(c)); //1 byte
printf("Size of ~c: %d\n", sizeof(~c)); //4 bytes

char 只有 1 个字节,但使用 ~ 运算符的结果将是 4 个字节。为什么结果是~c0xffffff99而不是0x99

我是否犯了一些错误?

【问题讨论】:

  • 根据“症状”,看起来结果升级为int。尝试转换回(未签名?)字符...
  • @AKX 你好,意思是~操作符会将所有小于4字节的数据类型升级为4字节,比如char、short?
  • 现在试试printf("%d\n", sizeof('\x66')); ;-)
  • sizeof() 返回的size_t 值的正确格式说明符是%zu,而不是%d
  • 除了你得到 UB 因为the correct specifier for sizeof is %zu

标签: c


【解决方案1】:

您看到的是integer promotion 的结果。几乎所有小于标准int 类型(例如charshort)的整数类型的操作都是对提升为int 类型的数据执行的,并且这些操作的结果也是提升的类型。此提升规则包括一元 ~ 运算符。

来自this C11 Draft Standard(我的粗体字):

6.5.3.3 一元算术运算符

...
4 ~ 运算符的结果是其(提升的)操作数的按位补码 (也就是说,结果中的每一位都被设置当且仅当对应的位在 未设置转换后的操作数)。整数提升在操作数上执行, 并且结果具有提升的类型。如果提升的类型是无符号类型,则 表达式 ~E 等于该类型中可表示的最大值减去 E。

在您的系统上,(升级的)int 类型的大小为 4 个字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 2017-07-05
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    相关资源
    最近更新 更多