问题描述
在此代码中:
我有2个成员的结构,并定义了3个变量。
代码:
#include <stdio.h>
#include <stddef.h>
typedef unsigned short int u16; /*2 byte unsigned int*/
typedef unsigned char u8; /*1 byte unsigned char*/
typedef struct
{
u8 id;
u8 salary;
} Emp;
void Math (Emp *Ptr1,Emp *Ptr2,Emp *resPtr);
void main ()
{
Emp Ahmed = {100,100};
Emp Ali = {200,200};
Emp Result = {0,0};
Math (&Ahmed,&Ali,&Result);
printf("%d\n%d\n",Result.id,Result.salary);
}
void Math (Emp *Ptr1,Emp *resPtr)
{
resPtr -> id = Ptr1 -> id + Ptr2 -> id;
resPtr -> salary = Ptr1 -> salary + Ptr2 -> salary;
}
结果是:
44
44
我正在使用gcc工具链,我到底在哪里出错?
解决方法
unsigned char
最多只能容纳255个值。分配一个更大的值将导致该值被有效地截断为最低的8位。
将成员的数据类型更改为unsigned short
。这样他们就可以保存结果。
代替手动声明这些typedef
typedef unsigned short int u16; /*2 byte unsigned int*/
typedef unsigned char u8; /*1 byte unsigned char
您应该在存在类似声明的地方包括标准标头stdint.h
。
此外,您的程序中甚至没有使用第一个typedef。
unsigned char
类型的对象的最大值的定义类似于(C标准)
-无符号字符类型的对象的最大值
UCHAR_MAX 255 // 28 − 1
因此,如果要添加100
和200
,则结果将被截断为44
。
因此,您至少应使用类型unsigned short
而不是unsigned char
。
此外,由于前两个参数在函数中未更改,因此应使用限定符const
进行声明。
这是一个演示程序。
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
typedef struct
{
uint16_t id;
uint16_t salary;
} Emp;
void Math( const Emp *Ptr1,const Emp *Ptr2,Emp *resPtr );
int main(void)
{
Emp Ahmed = { .id = 100,.salary = 100 };
Emp Ali = { .id = 200,.salary = 200 };
Emp Result = { .id = 0,.salary = 0 };
Math( &Ahmed,&Ali,&Result );
printf("%" PRIu16 "\t%" PRIu16 "\n",Result.id,Result.salary );
return 0;
}
void Math( const Emp *Ptr1,Emp *resPtr )
{
resPtr -> id = Ptr1 -> id + Ptr2 -> id;
resPtr -> salary = Ptr1 -> salary + Ptr2 -> salary;
}
程序输出为
300 300