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

有符号加法,无符号减法溢出处理的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++中也能被调用。

 //第二个函数的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;
}

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

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

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


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;
}