示例分析:
#include<iostream>
#include <stdio.h>
struct Result
{
char c;
char d;
unsigned char e;
};
Result getChar(int x, int y)
{
Result res;
unsigned int a = x;
(a + y > 10) ? (res.c = 1) : (res.c = 2);
res.d = a + y;
res.e = a + y;
return res;
};
int main()
{
Result res1;
res1 = getChar(7, 4);
printf("c1:%d\n", res1.c);
printf("d1:%d\n", res1.d);
printf("e1:%d\n", res1.e);
printf("---------------------\n");
Result res2;
res2 = getChar(7, 3);
printf("c2:%d\n", res2.c);
printf("d2:%d\n", res2.d);
printf("e2:%d\n", res2.e);
printf("---------------------\n");
Result res3;
res3 = getChar(7, -7);
printf("c3:%d\n", res3.c);
printf("d3:%d\n", res3.d);
printf("e3:%d\n", res3.e);
printf("---------------------\n");
Result res4;
res4 = getChar(7, -10);
printf("c4:%d\n", res4.c);
printf("d4:%d\n", res4.d);
printf("e4:%d\n", res4.e);
system("pause");
return 0;
}
运行结果:
上面的代码逻辑是让输入进getChar的x,y进行加和,先把x转换为无符号整型的类型,然后再与y进行加和,最后得到的结果存入变量d中,输出出来,如果d大于10则返回1,如果d小于或等于10则返回2。
那么问题来了,在第四组的输入中,d4=-3,是小于10的,但为什么c的值确是1呢?
这就要说到无符号整型数据和有符号整型数据的区别和联系了。
有/无符号整型数据的定义
- 当有符号数(int)和无符号数(unsignedint)进行算数运算时,有符号数(int)会先转换为无符号数(unsignedint),再进行相应的算数运算。
- 无符号整型和有符号整型的区别就是无符号类型可以存放的正数范围比有符号整型中的范围大一倍,因为有符号类型将最高位储存符号,而无符号类型全都储存数字。
- 无符号整型不能存储负数,但存储的最大值可以扩大一倍。
有/无符号整型数据的转换
有->无:1)如果无的最高位是1,取补码;2)如果无的最高位是0,直接保存。
取补码:1)是正数的话,是其本身;2)是负数的话,符号位不变,其余各位取反,最后一位加1。
有/无符号整型数据的计算
另外需要知道的是,当表达式中存在有符号类型和无符号类型的变量时,所有的操作数都会自动的转换为无符号类型进行计算。
那么再回到此题中来,当输入为(7,-7)的时候,把-7转换成一个非常大的无符号类型,然后与7相加后,处于一个正好溢出的边缘,相当于被正好中和了,d为0了,所以c所返回的还是1。
但当输入(7,-10)的时候,剩余的加和结果为-3,被转换为无符号整型,是一个很大很大的数(e = 253),肯定比10大,于是,就出现了第四组的情况,返回的结果为-3,但c却是1。