int main () {
unsigned int a = -2;
printf("%d", a); // -2
return 0;
}
好像用起来没什么区别?
int main () {
unsigned int a = -2;
printf("%d", a); // -2
return 0;
}
好像用起来没什么区别?
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的解释就懂了。
1 回答1.3k 阅读
1 回答1.1k 阅读
1 回答913 阅读
864 阅读
811 阅读
728 阅读
670 阅读
类型,决定了编译器如何解释一段内存的内容,比如
-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)
呢,就要多加几个符号进行强制类型转换了。至于为什么最后一个是
NaN
(Not A Number)请看
IEEE754
标准:http://baike.baidu.com/link?u...