2016-05-05 21 views
2

在我的笔记本电脑,运行下面的代码:为什么对char应用按位不产生int?

#include <iostream> 
using namespace std; 

int main() 
{ 
    char a; 
    cout << sizeof(~a) << endl; 
} 

打印4

我预计~a的结果是char,但显然它是一个int

这是为什么?

+1

虽然这可能是一个骗局(找一个),我不会得到downvote。如果不了解整体促销规则,这对于寻找我来说并不容易。 –

+2

[This](https://stackoverflow.com/questions/30473958/what-is-going-on-with-bitwise-operators-and-integer-promotion)一开始并不坏。 OP:你认为这够好吗? –

+0

糟糕,没有注意到'sizeof'。 – Barmar

回答

5

~是arithemtic运营商(按位NOT),并a正在从signed char晋升为int(并且在许多实现中sizeof(int) == 4)。参阅下面的解释:

http://en.cppreference.com/w/cpp/language/implicit_conversion#integral_promotion小积分类型(如炭)的

Prvalues可被转换成较大的整数类型的 prvalues(如int)。特别是, 算术运算符不接受类型小于int的类型作为 自变量,并且积分提升会在 左值到右值转换后自动应用(如果适用)。此转换始终保留该值。

+0

谢谢您的回答!我想我已经明白了。但我想知道为什么它在C++中以这种方式实现。 –

+1

@HanQiu因为C也是这样,所以C++应该是广泛兼容的。现在为什么C做它我不知道。也许有些*“'int'是最快的整数类型原因”*。 –

+0

@BaummitAugen关于'int'的任何证明是最快的?我们大多数人现在使用64位机器,32位'int'仍然是最快的? –

3

的标准说(§[expr.primary]/10):

的〜应具有一体或无作用域枚举类型的操作数;结果是它的操作数的补码。积分促销被执行。结果的类型是提升操作数的类型。

“整体状况” 是指(§[conv.prom]/1):

以外的整数类型的prvalue boolchar16_tchar32_t,或wchar_t其整数转换秩(4.13 )低于排名int可以转换为int类型的预值如果int可以表示源类型的所有值;否则,源值可以转换为unsigned int类型的值。

在你的情况,a具有类型char,其中有一个转换等级小于int 军衔,所以它被晋升要么intunsigned int,两者具有相同的尺寸(显然4在你的实现中)。至于为什么要这样做:我认为很重要的一点是它只是简化了语言定义和编译器。不必为几乎所有类型分别生成代码,它最好将所有内容都折叠成几种类型,而且大多数代码仅针对这些类型生成。现在情况并非如此(现在我们有多种类型,大于int),但当C小时,整数类型为:charshort,int(以及它们的未签名版本),所以所有其他类型被提升为int,并且所有操纵任何东西的代码都是用ints完成的。

注意,这适用于函数调用和这样太:用C的早期版本中没有的函数原型,所以char类型或short的任何参数传递给函数之前也被晋升为int

相同的基本想法是,随后用浮点类型:在大多数情况下(包括将它们传递给函数)float小号晋升为double,并double S(之后你可以转换回做所有的实际处理。float,如果必要的话


  1. 如果你真的想为报价太(第[conv.rank]:

1.3除了bool,char16_t,char32_t或wchar_t以外的整数转换等级(4.13)小于int等级的整数类型的值可以转换为int类型的值,如果int可以表示所有的值源类型;否则,可以将源prvalue转换为unsigned int类型的prvalue。
[...]
1.6 char的等级应等于signed char和unsigned char的等级。

相关问题