C中unsigned int和int有什么区别?
本文介绍了C中unsigned int和int有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
int main () {
unsigned int a = -2;
printf("%d", a); // -2
return 0;
}
好像用起来没什么区别?
解决方案
类型,决定了编译器如何解释一段内存的内容,比如-2
和 4294967294
其实在内存类保存的都是0xFFFFFFFE
。当解释为signed
之后,就是前者,unsigned
就是后者,甚至可以解释为是float
。
而整型(包括char)间的类型其实只是改变解释方式,而不改变内存状态,所以unsigned int a=-2
和a=0xFFFFFFE
没有区别。
printf
的第二个以及之后的可以是任意类型的,所以,其实是printf
这个函数让解释器是按照那些%d
之类的东西确定为,比如%d
是signed
%u
是 unsigned
。
记住一件事情,类型仅仅是为了防止我们这群菜鸟犯错,编译后的代码是没有类型这么一说的。所以,在编译器保证没错的情况下,可以自动类型转换。在你很确定你没错的情况下,可以进行强制类型转换。
在java里面要求if
后面必须是Boolean
为了防止==
写成=
,比如if(a==1)
(所以C里面一般到过来写if(1==a)
)。这么做有好也有不好,好的是防止你犯错,坏的是没有那么灵活了万一你真想写if(a=1)
呢,就要多加几个符号进行强制类型转换了。
#include<stdio.h>
int main(){
int a=0xFFFFFFFE;
float f,*p;
f=a;// signed整形转为float,这个类型转换会改变内存的状态
printf("%f",f); // -2.0000...
f=(unsigned int) a; // 整型间的类型其实只是改变解释方式,而不改变内存状态。
printf("%f",f); // 4294967294.000...
p = (float *)&a;
printf("%d %u %f",a,a,*p); // -2 4294967294 -nan
return 0;
}
至于为什么最后一个是NaN
(Not A Number)
请看IEEE754
标准:http://baike.baidu.com/link?u...
这篇关于C中unsigned int和int有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文