C语言奇特的一面(连载1)---自动类型转换

  测试空间旗下大头针出品
  不到不知道的预备知识:
  在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这样一种结果。 
 

你可能感兴趣的:(c,测试,存储,语言)