我试着理解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吗?
答案 0 :(得分:20)
操作员~
,在实际操作之前,对类型执行整数提升 1 ,
所以~c
的类型是实现定义的, 2 int
或unsigned 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开始,一元算术运算符:
约束:
一元
+
或-
运算符的操作数应具有算术类型;~
运算符的,!
运算符的整数类型; ,标量类型。
语义:
~
运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当未设置转换的操作数中的相应位时,才会设置结果中的每个位。)整数提升在操作数上执行,结果具有提升类型。
总结:~
的操作数具有整数类型,操作数值根据整数提升进行提升,表达式的结果类型为提升类型。 (整数促销活动会将int
或int
中的任何内容&#34;较小的&#34;变为unsigned int
或void doSomething(bool flag) {
if (flag) {
//whatever
}
}
template <bool flag>
void doSomething() {
if (flag) {
//whatever
}
,并保留其他所有内容。)