【问题标题】:What is the datatype returned by the bitwise complement operator?按位补码运算符返回的数据类型是什么?
【发布时间】:2016-07-09 17:05:35
【问题描述】:

我试图了解 C 中的按位补码运算符究竟返回了什么。 (不是“哪个值”,而是“哪个数据类型”。我想我理解位补码在理论上是如何工作的,所以不需要重新解释)

考虑以下代码:

int main(int argc, char **argv){
   char c = 'A';
   printf("%d, %d\n", sizeof(c), sizeof(~c));
   return 0; 
}

虽然第一个 sizeof() 返回 1,但后者在我的机器上返回 4。

所以我的问题是:~c 属于哪个数据类型?

我在 32 位 Linux 上工作,如果我在 64 位机器上工作,结果会变为 8 吗?到目前为止,我最好的猜测是,按位运算应用于寄存器并且返回值不会转换回 char 值。对于其他编译器,这种行为是否会有所不同,或者 C 标准是否定义了返回的内容~c?

【问题讨论】:

标签: c


【解决方案1】:

算子~,在实际操作之前,对类型进行整数提升1
所以~c 的类型是实现定义的,2intunsigned int

还要注意sizeof 的结果是size_t 类型,应该打印%zu 而不是%d


1(引自 ISO:IEC 9899:201x 6.3.1.1 布尔值、字符和整数 2)
如果一个 int 可以表示原始类型的所有值(受宽度限制,对于一个 bit-field),该值被转换为一个 int;否则,将其转换为无符号 诠释。这些被称为整数促销。 58) 所有其他类型均由 整数促销。 58) 整数提升仅适用于:作为通常算术转换的一部分,对某些 参数表达式,一元 +、- 和 ~ 运算符的操作数,以及 移位运算符,由它们各自的子条款指定。

2 澄清为什么这两种类型,而不仅仅是int。这是因为char 可能是有符号或无符号的,C 标准允许unsigned char 不能用int 表示,因为后者的范围可能太小。如果你选择了signed char类型,它只能升级为int

【讨论】:

    【解决方案2】:

    从 6.5.3.3 开始,一元算术运算符:

    约束

    一元+- 运算符的操作数应具有算术类型; 属于~ 运算符,整数类型;属于! 运算符,标量类型。

    语义

    ~ 运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当未设置转换后的操作数中的相应位时,结果中的每个位都被设置。)整数对操作数执行提升,并且结果具有提升的类型

    总结一下:~的操作数是整型,操作数的值是根据整型提升来提升的,表达式的结果类型就是提升的类型。 (整数促销将任何比int“更小”的东西变成intunsigned int,其余的都保持原样。)

    【讨论】:

      猜你喜欢
      • 2013-11-21
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多