c语言数据类型方面的问题,请大家看看为啥计算会溢出?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言数据类型方面的问题,请大家看看为啥计算会溢出?相关的知识,希望对你有一定的参考价值。
v->Up = (signed int)(((signed long)0x00fb8c00*(signed long)0x00666666)>>24);这段程序会提示警告:overflow in constant expression of type "signed int"我用的是一种32位单片机,调试软件是tasking。signed long定义成宏UINT 64,signed int 定义成 UINT 32。我想问的是为什么会溢出,然后又什么解决办法?
如果在程序之前声明 比如:signed long m=0x00fb8c00;signed long h=0x00666666;写成 v->Up = (signed int)((m*h)>>24)就不会有警告。这是为什么?
回答满意的可以再加分。
因为在C语言运算里面,取值*运算符的优先级最高,所以变成了这样:(signed int)(((signed long)0x00fb8c00(*(signed long)0x00666666))>>24); 会把0x00666666地址里面的signed long型的数据读取出来在进行运算。所以会报错! 参考技术B v->Up = (signed int)(((signed long)0x00fb8c00*(signed long)0x00666666)>>24);运算的时候会是常数结果有符号长整型。下面的m*n就是一个值,你没有赋给任何变量,就是在内存中的一个值。
关于C语言数据类型转换的一个小问题,很简单哦!!
chara;intb;floatc;doubled; 则表达式a*b+c-d值的类型是什么? 请解释一下原理啊,谢谢
参考技术A 数据类型转换有两种:a强制类型转换,通过函数实现,如
charc='a';inti;i=int(a);//强制转换,但不会改变a本身的类型。
b自动类型转换,通过编译器自动实现,
不同类型的数据在一个表达式中会自动转换为最长的类型:
如你定义的chara;intb;floatc;doubled;
计算a*b+c-d时,按计算顺序说明类型转换:
1a*b//char类型的a转换为int类型的值,再和int类型的b相乘
2a*b+c//int类型的a*b转换为float类型值,再和float类型的c相加
3a*b+c-d//float类型的(a*b+c)转换为double类型的值,再和double类型的d相减
不考虑过程,最终表达式的值为最长类型(这里是double)的值
以上是关于c语言数据类型方面的问题,请大家看看为啥计算会溢出?的主要内容,如果未能解决你的问题,请参考以下文章
计算机高手大神来啊啊啊!啥是溢出,它对二进制有何影响呢?谢谢啦!详细点哦!
为啥这个 BigInteger 值会导致堆栈溢出异常? C#