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)就不会有警告。这是为什么?
回答满意的可以再加分。

参考技术A 你是想让他们做乘法运算吗?如果是的话,你需要改成这样: (signed int)(((signed long)0x00fb8c00*((signed long)0x00666666))>>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语言数据类型方面的问题,请大家看看为啥计算会溢出?的主要内容,如果未能解决你的问题,请参考以下文章

C语言程序问题,数组元素无法赋值?请大家帮忙看看

计算机高手大神来啊啊啊!啥是溢出,它对二进制有何影响呢?谢谢啦!详细点哦!

为啥这个 BigInteger 值会导致堆栈溢出异常? C#

由于堆栈溢出,C 中通常会发生啥?

C语言指针初学者 请帮我看看下面的提 为啥调用函数返回值是char型的 这样不就只能返回一个字符了吗

为啥C语言中用float类型进行较大值的运算会丢失较多精度