C语言中的自动类型转换:
在C语言中,进行混合运算时,编译系统遵循一定规则,完成数据类型的自动转换,即隐式类型转换。一般是占用内存字节数少类型,向占用内存字节数多的类型进行转换,以防止精度丢失。
C语言中有符号数与无符号数的加法预算:
unsigned int与int相比,拥有更大的正数范围。所以,无符号数与有符号数进行运算时,先需要将有符号数转化为无符号数进行操作。以下代码所展示出的结果,就验证了这一特点。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int data1 = -10;
unsigned int data2 = 5;
printf("%d\n", data1 + data2);
(data1 + data2) > 0 ? printf("大于0\n") : printf("小于0\n");
system("pause");
return 0;
}
在上述代码中,-10会被编译器转换为无符号的int类型,其二进制形式为:1111 1111 1111 0110(与其绝对值相同的正数10正是它取反加一的结果)。它与无符号数5(二进制形式为0000 0000 0000 0101)相加的结果,就是1111 1111 1111 1011。这个数被作为无符号数在进行比较时,是远远大于0的;做输出时,因为有%d,即以有符号数int型进行输出,所以打印的结果是-5(1111 1111 1111 1111是-1,上面的数第三个二进制位为0,所以比-1小4,即为-5)。
再看下面一段代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int a = -1;
unsigned int b = 2;
a >= b ? printf("yes\n") : printf("no\n");//yes
system("pause");
return 0;
}
无符号的int类型与有符号的int类型在进行比较时,也会将有符号数转换为无符号数再进行比较。同理,将-1的补码作为正数形式比较,远远大于2。
且让我们再将以上代码稍加改动:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int a = -1;
unsigned int b = 2;
(a+b) > 0 ? printf("yes\n") : printf("no\n");//yes
system("pause");
return 0;
}
当a与b进行加法运算时,int类型数据溢出,高位被自动舍弃,结果为正数1,所以大于0。
如下代码即可验证a+b的值为1:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int a = -1;
unsigned int b = 2;
(a+b) == 1 ? printf("yes\n") : printf("no\n");//yes
system("pause");
return 0;
}
解决此类问题,只需记得同类型有无符号数进行加减或比较时,会先将有符号数转换为无符号数进行操作,这样即可根据数值的补码自行判断结果。