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这样一种结果。 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值