64,654
社区成员
发帖
与我相关
我的任务
分享
-1 的
原码: 0x80000001
反码: 0xfffffffe
补码: 0xffffffff
[/quote]
你是说在int nTest = 0xffffffff的时候,若是没有发生溢出,比如说long int lTest=0x80000000ffffffff;,它在内存里面存放的话就是存放他的补码,但是现在发生溢出了,因此直接将0xffffffff作为补码存放进去了么,是这样理解么?[/quote]
long int lTest=0x80000000ffffffff
这个也溢出了吧 ...
放进内存里的东西和你写的东西是两回事。只不过对以整数来说他们碰巧经常是一样的而已。
编译器在把一个数放进内存之前,要先确定他的数值,跟他的类型。
之后,根据类型对数值进行编码。(对有符号整数来说,经常是补码)
0xffffffff 数值是 2^32-1 ,类型是 unsigned int 。把他赋给 int ,要经过类型转换(implementation-defined, 这里溢出了),结果数值是 -1 ,类型 int 。之后,写进内存的是按照 int (补码)编码的 -1 。输出的时候,也是按照 nTest 的类型 (int) 解释内存中的内容,进行输出。
你可以想一下
double dTest = 0xffffffff;
会发生什么。[/quote]
也就是说,还是因为类型转换产生了溢出,编译器处理溢出后,转换为了-1是么?请问您是怎么知道这个的。。。有什么参考文献么我想看看-1 的
原码: 0x80000001
反码: 0xfffffffe
补码: 0xffffffff
[/quote]
是的,正数才是一样的,昨天不知怎么想的。。-1 的
原码: 0x80000001
反码: 0xfffffffe
补码: 0xffffffff
[/quote]
你是说在int nTest = 0xffffffff的时候,若是没有发生溢出,比如说long int lTest=0x80000000ffffffff;,它在内存里面存放的话就是存放他的补码,但是现在发生溢出了,因此直接将0xffffffff作为补码存放进去了么,是这样理解么?[/quote]
long int lTest=0x80000000ffffffff
这个也溢出了吧 ...
放进内存里的东西和你写的东西是两回事。只不过对以整数来说他们碰巧经常是一样的而已。
编译器在把一个数放进内存之前,要先确定他的数值,跟他的类型。
之后,根据类型对数值进行编码。(对有符号整数来说,经常是补码)
0xffffffff 数值是 2^32-1 ,类型是 unsigned int 。把他赋给 int ,要经过类型转换(implementation-defined, 这里溢出了),结果数值是 -1 ,类型 int 。之后,写进内存的是按照 int (补码)编码的 -1 。输出的时候,也是按照 nTest 的类型 (int) 解释内存中的内容,进行输出。
你可以想一下
double dTest = 0xffffffff;
会发生什么。[/quote]
也就是说,还是因为类型转换产生了溢出,编译器处理溢出后,转换为了-1是么?请问您是怎么知道这个的。。。有什么参考文献么我想看看[/quote]
C++ 标准
https://isocpp.org/std/the-standard
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf
不过这东西可能不太适合初学者-1 的
原码: 0x80000001
反码: 0xfffffffe
补码: 0xffffffff
[/quote]
你是说在int nTest = 0xffffffff的时候,若是没有发生溢出,比如说long int lTest=0x80000000ffffffff;,它在内存里面存放的话就是存放他的补码,但是现在发生溢出了,因此直接将0xffffffff作为补码存放进去了么,是这样理解么?[/quote]
long int lTest=0x80000000ffffffff
这个也溢出了吧 ...
放进内存里的东西和你写的东西是两回事。只不过对以整数来说他们碰巧经常是一样的而已。
编译器在把一个数放进内存之前,要先确定他的数值,跟他的类型。
之后,根据类型对数值进行编码。(对有符号整数来说,经常是补码)
0xffffffff 数值是 2^32-1 ,类型是 unsigned int 。把他赋给 int ,要经过类型转换(implementation-defined, 这里溢出了),结果数值是 -1 ,类型 int 。之后,写进内存的是按照 int (补码)编码的 -1 。输出的时候,也是按照 nTest 的类型 (int) 解释内存中的内容,进行输出。
你可以想一下
double dTest = 0xffffffff;
会发生什么。-1 的
原码: 0x80000001
反码: 0xfffffffe
补码: 0xffffffff
[/quote]
你是说在int nTest = 0xffffffff的时候,若是没有发生溢出,比如说long int lTest=0x80000000ffffffff;,它在内存里面存放的话就是存放他的补码,但是现在发生溢出了,因此直接将0xffffffff作为补码存放进去了么,是这样理解么?-1 的
原码: 0x80000001
反码: 0xfffffffe
补码: 0xffffffff