這是我們老師布置的實驗題,請教大神。。
實驗名稱:跨系統的整型數據類型運算
實驗目的:理解不同系統之間存在數據類型的不兼容,理解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;
}