打印

一个很小白的C问题求解

[复制链接]
1306|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
布丁奶茶|  楼主 | 2016-4-1 16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
unsigned int D0;
unsigned long int X;
X=D0*5000/1025;
现在我D0=876,为什么X的值不正确呢?
理论上不应该是876*5000/1024=4277吗?
而且876*5000=4380000=0x42D560;也在X的范围内啊
求大神指教!

相关帖子

沙发
zyj9490| | 2016-4-1 16:56 | 只看该作者
本帖最后由 zyj9490 于 2016-4-15 19:12 编辑

右边的运算过程以UIN16作为数据类开型,中间结果也一样,而且这二个常量数字没有标明数据类型,结果以UINT16来对全部变量标,因此你必须在一个数字量如5000ul,(表明此数字常量是UINT32位)替换原来的5000,即可以了。以后的运算,以ULONG进行类型升级运算。

使用特权

评论回复
板凳
布丁奶茶|  楼主 | 2016-4-1 16:59 | 只看该作者
zyj9490 发表于 2016-4-1 16:56
左边的运算过程以UIN16作为数据量,中间结果也一样,你必须在一个数字量如5000ul,替换原来的5000,即可以了 ...

还是不太明白,能举个例子吗?谢谢了

使用特权

评论回复
地板
zyj9490| | 2016-4-1 17:06 | 只看该作者
是不是得到的结果是0X35.

使用特权

评论回复
5
zyj9490| | 2016-4-1 17:11 | 只看该作者
本帖最后由 zyj9490 于 2016-4-1 20:25 编辑
布丁奶茶 发表于 2016-4-1 16:59
还是不太明白,能举个例子吗?谢谢了

中间数据溢出,高位丢了。876*5000=0X42D560,因中间结果也是U16,高位丢失,变成0XD560.实际上,跟编译器有关。有的可以,有的不可以,保险可靠的话,如我说的,数字上直接指标类型。

使用特权

评论回复
6
oayzw| | 2016-4-2 10:28 | 只看该作者
本帖最后由 oayzw 于 2016-4-2 10:31 编辑

请问是哪个平台?
试试:
unsigned int D0;
unsigned long int X;
X=D0;
X*=200;
X/=41;

使用特权

评论回复
7
billliu66| | 2016-4-2 11:06 | 只看该作者
D0为int,算式876*5000/1024,数据字节最大为int,运算876*5000/1024运算时C会把算式中的数都当作int,int 的最大数65535, 876*5000会溢出,再除1024当然计算结果会不对,计算结果再转换为long 赋值给左边结果还是不对。需在“X=D0*5000/1025;”的“D0”前加强制转换long,X=(龙)D0*5000/1025;这样结果会对。

使用特权

评论回复
8
undersky| | 2016-4-2 11:29 | 只看该作者
楼主看下 sizeof(int)是几,确认下int的字节。按理说如果是4的话,不会溢出的。楼主程序跑在什么平台下

使用特权

评论回复
9
自由心飞扬| | 2016-4-2 13:42 | 只看该作者
你用的什么编译器, 整形数据的除法余数被舍弃了,得到的是整数部分。另外最好加括号来指明先进行哪个运算。

使用特权

评论回复
10
cool_coder| | 2016-4-2 15:43 | 只看该作者
int型字长问题:
int 类型并不是固定长度的,它会随着平台改变。
long int型至少应该和int型一样长,而int型至少应该和short int一样长。
① C/C++规定int字长和机器字长相同;
② 操作系统字长和机器字长未必一致;
③ 编译器根据操作系统字长来定义int字长;
http://www.programfan.com/club/showbbs.asp?id=145906
由上面三点可知,在一些没有操作系统的嵌入式计算机系统上,int的长度与处理器字长一致;有操作系统时,操作系统的字长与处理器的字长不一定一致,此时编译器根据操作系统的字长来定义int字长:“比如你在64位机器上运行DOS16系统,那么所有for dos16的C/C++编译器中int都是16位的;在64位机器上运行win32系统,那么所有for win32的C/C++编译器中int都是32位的”。(CPU的“字长”是指其一条指令/一次运算可以处理的数据的最大宽度。http://www.cublog.cn/u/23458/showart.php?id=175995
另外,对于整型的数值范围,每个编译器里面都有一个标准头文件:limits.h,这个头文件定义了一些宏,这些宏表示该编译器使用的所有数据类型的范围,编程过程中 使用这些宏就行了。例如你想要的int的最大值可以使用宏INT_MAX,最小值使用INT_MIN,而无符号则可以使用UINT_MAX,还有其它类型 的。你自己把这个头文件打开看看就知道了。

使用特权

评论回复
11
ghost2| | 2016-4-2 19:13 | 只看该作者
不用stdint.h?

使用特权

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

本版积分规则

44

主题

180

帖子

1

粉丝