C中unsigned int和int有什么区别?

int main () {

unsigned int a = -2;
printf("%d", a); // -2

return 0;

}

好像用起来没什么区别?

阅读 21k
3 个回答

类型,决定了编译器如何解释一段内存的内容,比如-24294967294 其实在内存类保存的都是0xFFFFFFFE。当解释为signed 之后,就是前者,unsigned就是后者,甚至可以解释为是float
而整型(包括char)间的类型其实只是改变解释方式,而不改变内存状态,所以unsigned int a=-2a=0xFFFFFFE没有区别。

printf的第二个以及之后的可以是任意类型的,所以,其实是printf这个函数让解释器是按照那些%d之类的东西确定为,比如%dsigned %uunsigned

记住一件事情,类型仅仅是为了防止我们这群菜鸟犯错,编译后的代码是没有类型这么一说的。所以,在编译器保证没错的情况下,可以自动类型转换。在你很确定你没错的情况下,可以进行强制类型转换。
在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...

printf("%d", a)把二进制数按有符号数处理,所以还是-2。
尽量不要混合signed和unsigned,比如

int i;
unsigned int j = -1;

...

/* 这句话不会运行 */
if (i > j) {
    ...
}

if里面的语句不会运行,因为比较的时候,i会被转换成无符号数。这个时候,j = 0xFFFFFFFF,是最大的无符号数,所以if里面的语句不会运行。

unsigned int a = -2;
printf("%d\n", a);
cout << a << endl;

输出如下:
-2
4294967294

你看下printf里%d的解释就懂了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏