按位补码运算符返回的数据类型是什么?

时间:2016-07-09 17:05:35

标签: c

我试着理解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吗?

2 个答案:

答案 0 :(得分:20)

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

另请注意,sizeof的结果是size_t类型,应使用%zu而不是%d打印。

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

2 澄清两种类型的原因,而不仅仅是int。这是因为char可能是签名的或未签名的,unsigned char的C标准允许int不能表示,因为后者的范围也可能是signed char小。如果您选择了int类型,则只能将其提升为 <input class="cmn-tgl" type="checkbox" ng-true-value="true" ng-false-value="false" ng-model="user.habits.early_riser" ng-change="updateUserDetails()">

答案 1 :(得分:7)

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

约束

  

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

语义

  

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

总结:~的操作数具有整数类型,操作数值根据整数提升进行提升,表达式的结果类型为提升类型。 (整数促销活动会将intint中的任何内容&#34;较小的&#34;变为unsigned intvoid doSomething(bool flag) { if (flag) { //whatever } } template <bool flag> void doSomething() { if (flag) { //whatever } ,并保留其他所有内容。)