C 类型转换 隐式

来源:互联网 发布:刷网站访问量软件 编辑:程序博客网 时间:2024/05/19 16:47

类型转换问题需要十分重视,很多程序问题都处在这里,尤其是隐式类型转换。懂得规则,才能胜出。

先看一段代码,如果能全部猜对输出,恭喜你,过关!


using namespace std;int main(void){unsigned int a = 20;int b = -a;long long c = -a;long d = -a;double e = -a;float f = -a;__int32 g = -a;__int64 h = -a;cout<<a<<endl;cout<<b<<endl;cout<<c<<endl;cout<<d<<endl;cout<<e<<endl;cout<<f<<endl;cout<<g<<endl;cout<<h<<endl;return 1;}

正确输出:



看到这里,说明我们对于数据类型的隐式转换还有一些疑惑。讲解之前需要保证了解计算机如何表示负数

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理;同时,加法和减法也可以统一处理。

正整数的补码与原码相同。负整数的补码,符号位不变,数值位各位取反,最后整个数加1。

举个例子,比如十进制整型5(32位机器):


原码:00000000 00000000 00000000 00000101
反码:11111111 11111111 11111111 11111010
补码:11111111 11111111 11111111 11111011(-5    反码+1)


隐式类型转换原则:

1、当表达式中存在有符号类型和无符号类型的时候,所有的操作数都自动转换为无符号类型。
2
、基本数据类型 基本数据类型的转换以取值范围的作为转换基础(保证精度不丢失)。隐式转换发生在从小->大的转换中。

3、子类对象可以隐式的转换为父类对象。
4、转换顺序 char >> unsigned char >> int >> unsigned int >> long long >> unsigned long long 

5、转换顺序   char >> unsigned char >> int >> unsigned int >> double >> unsigned double

6、赋值运算时,优先转换为被赋值变量的类型。


解释一下开头代码结果:

int b = -a;  -a 即符号位置1 所以b为-20

long long c = -a;  符号位变为1,同时拷贝给c的低字节位置,得到很大的正数。e f h的结果与c一样。

 long d由于long在我的电脑上和int一样是32位的,所以d为-20。g的结果与d一样。



0 0
原创粉丝点击