易截截图软件、单文件、免安装、纯绿色、仅160KB

Keil C中用unsigned long要注意的问题

 Keil C里用到了unsigned long长整型变量,编译时都能通过,但运行时老是溢出,同伙百度到了此贴,解决了问题,于是转帖于此:
今天调试一个乘法,出了点问题,先看代码示意:
void test(void)
{
       unsigned long mid1,mid2,mid3;
       mid1=6*10000;//index1
       mid2=7*10000;//index2
        mid="8"*10000;//index3
}
咋一看,这段代码似乎是对的,其实不然,如果跟踪调试一下代码就会发现:
mid1=0xea60=60000;
mid2=0x1170=4464;
mid3=0x3880=14464;
mid1是正确的,mid2和mid3是错误的!
产生错误的原因是:
编译器在编译的时候把6*10000、7*10000以及8*10000计算得来的结果存在了一个unsigned int类型的变量当中,unsigned int类型变量的最大值是0xffff,即65536,因此在 index2与index3行中发生了数据溢出,导致计算错误!
解决方法:
void test(void)
{
       unsigned long mid1,mid2,mid3;
       mid1=6*(unsigned long)10000;//index1
       mid2=7*(unsigned long)10000;//index2
        mid="8"*(unsigned long)10000;//index3
}
请注意,以下代码是错误的!至于错误原因,大家自己分析吧。
void test(void)
{
       unsigned long mid1,mid2,mid3;
       mid1=(unsigned long)(6*10000);//index1
       mid2=(unsigned long)(7*10000);//index2
        mid=(unsigned long)(8*10000);//index3
}


相关文档:

C_使用break和continue控制循环语句

 源码:
# include <stdio.h>
 
int main( )
{
    int radius;
    double area;
    for(radius = 1; radius <= 10 ; radius++)
    {
        area = 3.1416 * radius * radius;
   ......

C_使用一维数组实现选择排序法

 源码:
/* 使用选择法排序 */
# include <stdio.h>
 
int main()
{
    int i, j, min, temp;
    /* 定义一个整型的一维数组 */
    int array[10];
    /* 输入数据 */
    printf("Please input ten integ ......

C_简单的子函数调用

 源码:
# include <stdio.h>
 
/* 子函数声明 */
int square(int x); // 实现求平方值的子函数
int cube(int y);   // 实现求立方值的子函数
 
int main()
{
    int m = 12;
    int n = 4;
    printf("%d %d\n", sq ......

c/c++语言中的字符集和字符编码

 在c语言中,hello world程序的编码其实未必就只有那一种书写格式,有些格式看起来有点乱码,却依然有着能正常编译,运行的良好品性,真是难能可贵,其中的秘密,看一看c语言中字符集和字符编码的描述吧。
??= include<stdio.h>
int main( int argc, char* argv??(??))
<%
      ......

C/C++ 文件读写操作总结

 C/C++ 文件读写操作总结
在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以使用多种方法对文件操作,下面我就按以下几个部分对此作详细介绍,就是:
 
1、基于C的文件操作;
2、基于C++的文件操作;
3、基于WINAPI的文件操作;
4、基于BCB库的文件操作;
5、特殊文件的操作。
壹 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号