xq734536013
热爱学习的呆萌的文青
采纳率54.8%
2015-12-21 08:05

有符号加法,无符号减法溢出处理的C程序,并运用条件编译指令。。

已采纳

这是我们老师布置的实验题,请教大神。。

实验名称:跨系统的整型数据类型运算
实验目的:理解不同系统之间存在数据类型的不兼容,理解C语言中为不同系统设计统一数据类型头文件,比如stdint.h。
实验内容:
1、编码实现一个**.c 和**.h两个文件,这**.C中的函数可以让其它程序能过包含**.h引用。“**”根据个人喜好命名。
2、只在小端的系统上运行程序;
3、在**.c中实现以下功能的函数,
函数1: int32_t sat_add(int32_t x, int32_t y, int32_t* flag) 带溢出判断的有附号加法,正溢出时*flag返回TMax, 负溢出时返回TMin;没有溢出时函数返回运算结果, flag返回NULL
函数2: uint32_t sat_sub(uint32_t x, uint32_t y, int32_t
flag) 无符号减法,带溢出判断的函数,只要溢出, flag返回-1;没有溢出,*flag返回NULL, 函数返回运算结果;
4、在
*.h中声明函数;请使用条件编译指令
#ifdef #define, #else, #ifelse, #endif
来防止头文件被多次重复包含
5、请学习使用“extern”关键字。百度上有。使得程序在C++中也能被调用。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • dragonvii dragonvii 6年前
     //第二个函数的flag参数类型应该是指针或者引用吧,不然没意义了,写个引用的算了,如果是指针就照第一个改
    //extern没太搞懂,这两个函数用不上这个啊,一般用C++写全局变量时就是那种定义在cpp中但是其他.h .cpp也要用时声明
    
    //ooxx.h
    #ifdef OOXX_H
    //啥都不做了
    #else
    #define OOXX_H
    
    
    #define i32 int
    #define ui32 unsigned int
    #define TMax 1
    #define TMin -1
    #define NULL 0
    
    i32 sat_add( i32 x, i32 y, i32* flag );
    ui32 sat_sub( ui32 x, ui32 y, ui32& flag );
    
    #endif
    
    //ooxx.c
    #include "ooxx.h"
    
    
    i32 sat_add( i32 x, i32 y, i32* flag )
    {
        i32 r = x + y;
        //正溢出
        if( flag && x > 0 &&  y > 0 && r < 0 )
        {
            *flag = TMax;
        }else
        //负溢出
        if( flag && x < 0 && y < 0 && r > 0 )
        {
            *flag = TMin;
        }else
        //不溢出
        {
            *flag = NULL
        }
        return r;
    }
    
    ui32 sat_sub( ui32 x, ui32 y, ui32& flag )
    {
        ui32 r = x - y;
    
        //溢出
        if( x - r != y || y + r != x )flag = -1
        没溢出
        else flag = NULL;
    
        return r;
    }
    
    点赞 评论 复制链接分享
  • dragonvii dragonvii 6年前

    第二个函数算法貌似有问题,我没编译器不好意思,试试这个吧

    
    ui32 sat_sub( ui32 x, ui32 y, ui32& flag )
    {
        ui32 r = x - y;
    
        //溢出
        if( x - y != x - ( x - y ) )flag = -1;
        //没溢出
        else flag = NULL;
    
        return r;
    }
    
    点赞 评论 复制链接分享
  • dragonvii dragonvii 6年前

    我没编译器,大致这个意思吧,编译一下按F4把我的错误改一下好了

    点赞 评论 复制链接分享
  • John_ToString John_ToString 6年前

    你是要截图呢,还是要代码呢,还是要什么? 知识点可以么。。。

    点赞 评论 复制链接分享

相关推荐