不到不知道的预备知识:
在C语言中,所有的数据都是以2进制补码的形式存储的,正数的原码和补码是相同的,但负数的原码和补码是不一样的。在VC环境下一个无符号整型和有符号整型都占4个字节。
题目中i=-11,原码如下:
1000 0000 0000 0000 0000 0000 0000 1011
补码形式如下:
1111 1111 1111 1111 1111 1111 1111 0101
在内存中存储形式是以补码的形式存储的.
unsigned int j=10;
原码如下:
0000 0000 0000 0000 0000 0000 0000 1010
补码与原码相同,形式如下:
0000 0000 0000 0000 0000 0000 0000 1010
在内存中存储形式是以补码的形式存储的.
#include<stdio.h>
void main()
{
int i=-11;
unsigned int j=10;
if(i<j)
printf("i<j");
else
printf("i>j");
}
这个程序的运行结果是i>j.i=-11,j=10。竟然-11会大于10.这不是天方夜谭吗?但是在C语言中这是正确的。为什么呢?请看下面的分析:
上面我们知道了i,j在内存中的存储形式,
当一个有符号的整型和一个无符号整型运算时:
根据C的自动类型转换原则,有符号的整型将会转化成无符号整型,那么原来的
j中存储的1111 1111 1111 1111 1111 1111 1111 0101是一个无符号数,也就是一个正数,那现在就出现了i>j这样一种结果。