问题描述
- 有符号加法,无符号减法溢出处理的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;
}
时间: 2024-12-24 06:26:31