
C语言中不同数据类型的混合运算
#include"stdafx.h"#include<iostream>usingnamespacestd;int_tmain(intargc,_TCHAR*argv[]...
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i = -8;
unsigned int iu = 10;
cout<<i+iu;
return 0;
}
我的理解:按照类型自动转换的原则,有符号整型应当转换为无符号整型,即i应该转换为一个正数,再和iu做加法运算,结果应当是一个很大的正数
实际输出:2
请问为什么?谢谢! 展开
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i = -8;
unsigned int iu = 10;
cout<<i+iu;
return 0;
}
我的理解:按照类型自动转换的原则,有符号整型应当转换为无符号整型,即i应该转换为一个正数,再和iu做加法运算,结果应当是一个很大的正数
实际输出:2
请问为什么?谢谢! 展开
1个回答
展开全部
再回来说下,你可以这样进行检测,看隐式转换的问题还是溢出的问题:
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范围的问题!
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范围的问题!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询