读书人

上面计算结果应该是什么?为什么呢

发布时间: 2012-09-08 10:48:07 作者: rapoo

下面计算结果应该是什么?为什么呢
int i = -20;
unsigned int j = 10;
求i+j的值?


[解决办法]
http://topic.csdn.net/u/20081017/00/fc4cbe92-2364-4170-a347-521e476faaa9.html
[解决办法]
c中,无符号数和有符号数运算时,有符号数被转换成了无符号数。

http://wenku.baidu.com/view/682714bcf121dd36a32d8202.html。从汇编层次说的。可以阅读
[解决办法]

C/C++ code
#include <stdio.h>#include <stdlib.h>int main(){    int i = -20;    unsigned int j = 10;    printf( "i+j:%d\r\n" , i + j );    system( "pause" );}
[解决办法]
探讨

C/C++ code
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i = -20;
unsigned int j = 10;
printf( "i+j:%d\r\n" , i + j );
system( "pause" );
}
VS2005不管编译成C,还是C++结果都是-10

[解决办法]
编译器自动类型提升
[解决办法]
探讨

引用:

C/C++ code
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i = -20;
unsigned int j = 10;
printf( "i+j:%d\r\n" , i + j );
system( "pause" );
}
VS2005不管编译成C,还是C++结果都……

[解决办法]
把32位的-20和10在内存中存放二进制数写出来,

把它们相加就是结果。而且只是它们是二进制数,要看编译器怎么解释它了

默认的情况如楼上所说,是无符号的,

但是你要是以%d或其他的格式解释它,你会得到不同的结果


[解决办法]
有符号数和无符号数一起运算时,编译器会都按照无符号数处理。其内部运行机制可参考前面几楼给出的网址看看。
[解决办法]
探讨

引用:

引用:

C/C++ code
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i = -20;
unsigned int j = 10;
printf( "i+j:%d\r\n" , i + j );
system( "pause" );
}
VS200……

[解决办法]
%d是针对有符号的整型数据的格式,%u才会输出无符号的
[解决办法]
int i = -20;
int类型占4个byte共32位
-20的二进制是 10000000 00000000 00000000 00010100
负数用的补码存储,先取反 11111111 11111111 11111111 11101011 符号不变
再加1 11111111 11111111 11111111 11101100

unsigned int j = 10;
无符号数,存储为 00000000 00000000 00000000 00001010

i+j 时,int转成了unsigned int,但是存储的二进制值还是不变
做加法,二进制值直接相加
11111111 11111111 11111111 11101100
+ 00000000 00000000 00000000 00001010
= 11111111 11111111 11111111 11110110
即位加法后的结果

若结果按照%d输出,因为%d代表有符号10进制整数
而结果首位为1(负数),所以将其还原
结果:11111111 11111111 11111111 11110110
减1 :11111111 11111111 11111111 11110101
取反:10000000 00000000 00000000 00001010 (符号不变)

即为-10,输出。
[解决办法]
类型提升。int + unsigned int的结果的类型是unsigned int。

看到输出负数,只是输出格式的问题。
[解决办法]
[Quote=引用:]

int i = -20;
int类型占4个byte共32位
-20的二进制是 10000000 00000000 00000000 00010100
负数用的补码存储,先取反 11111111 11111111 11111111 11101011 符号不变


再加1 11111111 11111111 11111111 1110……
[/Quote
正确
[解决办法]
i+ j没有值的概念这一说法,只是知道它在内存中存储的0和1bit位,如果你要把i+ j的结果以%d输出,那么肯定是-10,否则如果你用无符号数输出的话,那么肯定就是2^32- 10了。如果你非要知道i+ j的类型的话,我有一种方法可以让你知道在一个确定的平台上它的类型(我不知道标准 是不是定义了i+ j的类型)

用cout<<typeid(i+ j).name()<<endl;可以输出i+ j的类型(当然要#include <typeinfo>
[解决办法]
i + j的值是unsigned int类型,内容为:0xFFFFFFF6。
为什么要说内容呢,因为signed int和unsigned int其实都是一组bit,关键还是看上下文。
比如说这个结果,放到signed的上下文中,好比赋值给int类型的变量,或者用%d输出,那么就是-10。
还是这个结果,放到unsigned的上下文中,好比赋值给unsigned类型的变量,或者用%u输出,那么就是4294967285。
这里的上下文,其实就是cast的含义了。
另外这组bit的具体含义,可以看看signed/unsigned编码的相关知识。

读书人网 >C++

热点推荐