c语言 不同数据类型间的混合运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 不同数据类型间的混合运算相关的知识,希望对你有一定的参考价值。

书上有个例子
“6.0/5是将5转换成float型后进行运算,值是1.2”
而自动转换里float型不是要自动转换成double型参与运算,而且是必须的转换。(即使两个float型数据相加,也要先转换成double型,然后再相加)。

高手帮忙解释下啊,万分感谢!!!
书上写着
自动转换里float型要自动转换成double型参与运算,而且是必须的转换。(即使两个float型数据相加,也要先转换成double型,然后再相加)。

书上有个例子
“6.0/5是将5转换成float型后进行运算,值是1.2”
相矛盾了啊!???

c语言里 不同数据类型间的混合运算会强制转换的``
`如6.0/5``结果必然向float型转换```
比如char short型参与运算都是先转为int型`
float转为double型
int double混合运算时转为double型
都是向着占用较大的方向转换``使适用范围也更大```

``书上应该说的比较详细了 `呵呵`
参考技术A 再回来说下,你可以这样进行检测,看隐式转换的问题还是溢出的问题:
typedef unsigned long long uint64;//最新的编译器都支持这种用法吧,总之你找个能表示64位的longlong就行了.
//uint
cout << (uint64)iu + (uint)i << endl;

这里先将i转换成uint型,此时未溢出,然后加上转换uint64(iu)的值,再将其提升为uint64,因为原来已经为uint型,所以提升为uint64时值不再改变,最后结果超出了uint的范围,如果你再对最终结果进行(uint),得到的答案你应该知道了.

------------------
溢出问题.

i=-8,转化为uint型后,为2^32-8,再加上个uint(10),结果为:
2^32+2,溢出后,结果为2.

你只考虑到一个很大的正数,却没有考虑到uint范围的问题!

C语言各类数据类型间的混合运算

数据类型的转换一般有两种,自动转换强制转换,前者由编译器自动完成,后者由程序员完成。当我们进行不同数据类型间的混合运算的时候,由编译器自动完成类型转换。

一般的自动转化规则,按数据长度增加的方向进行转换。

如:

  1. intlong相加减时,会先把 int转换成 long再进行计算,运算结果是 long型;
  2. floatdouble时,会先把 float先转成 double,运算结果是 double型;
  3. charint时,会先把 char先转化成 int;
  4. 有符号和无符号混合运算时,有符号类型要转换成无符号类型,运算结果是无符号类型的。

针对第四条:

#include <stdio.h>
int main(void){ int a = -10; unsigned b = 5;
if ((a + b) > 0) { printf("Hello World!\n"); } printf("a + b = %d\n", a + b);
return 0;}

输出是这样的:

Hello World!a + b = -5

可见if ((a + b) > 0)这条语句为真。这说明a + b是正数,无符号的。这就是规则。

  1. 整数和浮点数混合运算时,整数先转化成浮点数,运算结果是浮点数;
  2. 赋值运算中, =号右边的会转化成左边的数据类型,如果右边的数据类型比左边的长,有可能丢失精度。

今天是 8 月 1 号。

C语言是很有趣的一门语言,有时间就看看C语言,以上内容主要参考的这本[1]

参考资料

[1]

《手把手教你学C语言》 : 吴明杰


以上是关于c语言 不同数据类型间的混合运算的主要内容,如果未能解决你的问题,请参考以下文章

C语言各类数据类型间的混合运算

各类数值型数据间的混合运算

各类数值型数据间的混合运算

C语言基本数据类型的转换

C语言中的数据类型转换

C语言中的数据类型转换