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

c

4个回答

 //第二个函数的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;
}
xq734536013
热爱学习的呆萌的文青 https://www.visualstudio.com/zh-cn/downloads/download-visual-studio-vs#d-community
4 年多之前 回复
dragonvii
dragonvii 重做系统一年没装C的东西了,你有vs2015的安装程序吗?能给我一份不?
4 年多之前 回复
xq734536013
热爱学习的呆萌的文青 怎么判断正溢出和负溢出的?
4 年多之前 回复
dragonvii
dragonvii 参数可以不写,但是写了更清楚,当参数多的时候一看见name就知道是啥,不然一大堆char*那个是那个都乱了,下划线与字符没区别,数字不能开头
4 年多之前 回复
xq734536013
热爱学习的呆萌的文青 函数声明i32 sat_add( i32 x, i32 y, i32* flag );这个的参数也要写吗?还有条件编译有些是这样写的#ifndef __A_H,前面有两个下划线,这个有什么讲究?
4 年多之前 回复

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

xq734536013
热爱学习的呆萌的文青 代码,我知识点了解过了,但是用VS2015尝试写过不会
4 年多之前 回复

我没编译器,大致这个意思吧,编译一下按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;
}
dragonvii
dragonvii 回复热爱学习的呆萌的文青: 你说的8位数类型是有符号的还是无符号的?看看补码的概念可能有帮助
4 年多之前 回复
xq734536013
热爱学习的呆萌的文青 比如两个8位的正整数相加,如果溢出,则结果是小于任何一个操作数的,这是为什么?
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐