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

c语言-有符号加法,无符号减法溢出处理的C程序,并运用条件编译指令。。的相关文章

深入分析C语言中的有符号和无符号

就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负.如果这个量不会有负值,那么我们可以定它为带正负的类型. 在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型. (unsigned)数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型. 字符类型也分为有符和无符类型. 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型. 2.使用二制数中的最高位表

c++-打印有符号和无符号char的区别

问题描述 打印有符号和无符号char的区别 写了这样一段代码,想要将数据按字节打印.(小端机器) #include <stdio.h> typedef char * byte_pointer; void show_bytes(byte_pointer data, int len) { int i = 0; for (i=0; i<len; ++i) { printf("0x%.2x ", data[i]); } printf("n"); } voi

【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创]   第一题 #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n",a+b); (a+b)>6? puts(">6"):puts("<=6"); return 0; }  答案是:>6   第二题 #include<stdio.h> 

C语言参考程序—无符号一位整数的四则运算

题目:输入一个无符号的一位整数的四则运算表达式,输出其结果.例如输入:1+3*6-2,则输出:17 分析:因为不涉及到括号,只是简单的四则运算,我的想法是如果有乘除法先计算,没有的话就按照加减法从左到右的顺序进行计算.在开始的时候,首先检查是否有乘除法运算符,有的话就取出前后两个操作数进行计算,将结果保存起来.没有的话就将加减运算符先存起来. 主要过程: 1.输入的是一个四则运算的表达式,在计算机中按照字符串的形式存储.数据和运算符需要分开处理. 2.引入一个整型的数组,其大小为字符串长度加一,

c语言-关于C语言无符号规格化的一个理解

问题描述 关于C语言无符号规格化的一个理解 看深入理解计算机系统里面.关于规格化的一段描述:......也就是说,指数的值是E=e-Bias其中e是无符号数,其位表示为ek-1···e1e0而Bias是一个等于2k-1 -1(单精度是127,双精度是1023)的偏置值..... 我知道C语言单精度的指数位是8位,取值范围是-126到127.但是我对E=e-Bias不理解.这里的e代表的是什么?本人小白求解释.. 解决方案 e就是你的指数值,给个例子 0100 0010 1**111 0110 0

C语言无符号长整型的左移运算

问题描述 C语言无符号长整型的左移运算 C语言(VC6.0)的无符号长整型是如何左移的,当左移的位数超过该数值类型的最大位数是怎么样处理的?求大神解答,不甚感激 解决方案 C语言左移运算符是<<,左移赋值运算符是<<= 左移运算根据您机器的位长,如32位.64位机器把long型数据转换成相应的二进制值.unsigned long不会转换为反码. //给您个例子32位机器 unsigned long lValue = 8L; //这时lValue的二进制制编码是00000000000

C语言的无符号数据类型转换

从网络中读取C的无符号int,short,byte字节数组,相应转换成java的long,char,short short anUnsignedByte = 0; char anUnsignedShort = 0; long anUnsignedInt = 0; int firstByte = 0; int secondByte = 0; int thirdByte = 0; int fourthByte = 0; byte buf[] = getNetData();//如:读网络字节数据 in

C语言之将无符号字符型转化为ascii码值

这个宏是在linux内核中获取的,主要的功能是能够将一个无符号字符型的参数转化为ASCII码值. ASCII : ASCII 编码里包括了128个字符.用 十进制 0  到 127 来表示 .那就对了, 0 到 127 不就是 128个字符吗. 每一个数字都代表一个字符.看ASCII 编码表 我们来看看代码: #include <stdio.h> #include <stdlib.h> #define toascii(c) (((unsigned char)(c))&0x7

可用于数论计算的无符号大整数类

前些日子,无意中访问到三思科学网,里面介绍了许多数论问题,这也是我儿时的爱好,于是就利用空闲时间编写了一个用于数论计算的无符号大整数类. 一.类的基本结构Class CUSuperInt { public: //构造及析构函数 CUSuperInt(); CUSuperInt(DWORD dwValue); CUSuperInt(char* pszVal); CUSuperInt(CUSuperInt& x); virtual ~CUSuperInt(); protected: DWORD *p