打印
[STM8]

32bit负数怎么表示?很蛋疼啊

[复制链接]
2399|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
试了下,他妈的int 是16bit的,只好换成Long int,不然移位都不对。更蛋疼的是这个:
uint16_t v1=200,v2=400;
long int delta = v1-v2;
结果delta出来16bit的负数形式,但因为是long int,那就是0x0000Fxxx,以32bit来表示就是正数。
请问大侠,如何使用负数32bit?
沙发
lanmanck|  楼主 | 2017-6-6 22:08 | 只看该作者
实例:


使用特权

评论回复
板凳
戈卫东| | 2017-6-6 23:53 | 只看该作者
long int delta = (int)v1-v2;
不知道这样行不行。不同工具可能会做不同的转换。

使用特权

评论回复
地板
lai832| | 2017-6-7 01:58 | 只看该作者
uint16_t v1=200,v2=400;
long int delta = v1-v2;
改这样:
uint16_t v1=200,v2=400;
long int delta = (long int)v1;
delta = delta - v2;

实不行:这样
uint16_t v1=200,v2=400;
long int delta;

if (v1 <0)      delta = ((long int)0) - (-v1);
else              delta = v1;

delta -= v2;

原理:v1,v2是16bit       两者相减     是16位相减   得到16bit的负数         直接位对位转给32位了

又或.    delta = (long int)(v1 - v2);     ---------算出16位的负数  再转数据类型, delta = v1 - v2,  没有转数据类型

因为不同的编译器不一定一样,所以自己试一下.

使用特权

评论回复
5
lanmanck|  楼主 | 2017-6-7 09:14 | 只看该作者
lai832 发表于 2017-6-7 01:58
uint16_t v1=200,v2=400;
long int delta = v1-v2;
改这样:

是的,强制转换,或者直接定义成long来计算。真坑爹啊。

使用特权

评论回复
6
icecut| | 2017-6-7 10:14 | 只看该作者
lanmanck 发表于 2017-6-7 09:14
是的,强制转换,或者直接定义成long来计算。真坑爹啊。

没办法,c语言就是这么设计的.因为你用int16是不必要的,给你自己找麻烦

使用特权

评论回复
7
lanmanck|  楼主 | 2017-6-9 08:55 | 只看该作者
icecut 发表于 2017-6-7 10:14
没办法,c语言就是这么设计的.因为你用int16是不必要的,给你自己找麻烦

跟c语言有毛关系,二货

使用特权

评论回复
8
icecut| | 2017-6-9 10:49 | 只看该作者
lanmanck 发表于 2017-6-9 08:55
跟c语言有毛关系,二货

你用vc6 验证一下.证明一下二货...
我以为你用stm32. 如果stm8的话...呵呵.都是c语言惹的祸...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

153

主题

397

帖子

3

粉丝