高手们分析一下C++ 中short 型变量最大值加1后没有变负值,也不知道是BUG还是它理应如此(人穷没有分啊。高手们不要生气啊)

jingzizhuo 2008-04-12 09:03:41
各位高手请帮忙分析下:
以下代码均在Microsoft Visual Studio 2005和eclipse3.2.0+CDT+MinGW中编译过
代码如下:
#include <iostream>
#include <climits>
using namespace std;

int main()
{
int n_int=INT_MAX;
short n_short=SHRT_MAX;
long n_long=LONG_MAX;
unsigned int n_unsigned_int=n_int;
unsigned short n_unsigned_short=n_short;
unsigned long n_unsigned_long=n_long;
cout << "short is : " << sizeof(short) << "bytes.\n";
cout << "short is : " << sizeof(n_short) << " bytes.\n";
cout << "n_int: " << n_int;
cout << "\t\tn_short: " << n_short;
cout << "\t\tn_long: " << n_long << endl;
cout << "n_unsigned_int: " << n_unsigned_int;
cout << "\tn_unsigned_short: " << n_unsigned_short;
cout << "\tn_unsigned_long: " << n_unsigned_long << endl;

cout << "----------------变量加1后-----------------------------\n";
cout << "n_int + 1: " << (n_int + 1);
cout << "\t\tn_short + 1: " << (n_short + 1);
cout << "\t\tn_long +1: " << (n_long + 1) << endl;

cout << "n_unsigned_int+1: "<< (n_unsigned_int + 1);
cout << "\t\tn_unsigned_short+1: " << (n_unsigned_short + 1);
cout << "\t\tn_unsigned_long+1: " << (n_unsigned_long + 1);
cout << "\n--------unsigned型变量置0然后减去1后-----------------\n";
n_unsigned_int=0;
n_unsigned_short=0;
n_unsigned_long=0;
cout << "n_unsigned_int-1: "<< (n_unsigned_int - 1);
cout << "\t\tn_unsigned_short-1: " << (n_unsigned_short - 1);
cout << "\t\tn_unsigned_long-1: " << (n_unsigned_long - 1);

return 0;
}
在Microsoft Visual Studio 2005和eclipse3.2.0+CDT+MinGW中编译后结果如下:
short is : 2bytes.
n_int: 2147483647 n_short: 32767 n_long: 2147483647
n_unsigned_int: 2147483647 n_unsigned_short: 32767 n_unsigned_long: 2147483647
----------------变量加1后----------------------------
n_int + 1: -2147483648 n_short + 1: 32768 n_long +1: -2147483648
n_unsigned_int+1: 2147483648 n_unsigned_short+1: 32768 n_unsigned_long+1: 2147483648
--------unsigned型变量置0然后减去1后-----------------
n_unsigned_int-1: 4294967295 n_unsigned_short-1: -1 n_unsigned_long-1: 4294967295

问题出现在short型变量。给short型变量取最大值32767.我用的是C++内climits自定义的最大值SHRT_MAX。即然为最大值为什么加1后,结果没有像int型变量和long变量那样变为负值呢。难道short型变量占用了更多的字结。我就用sizeof()计算发现是2Byte.就不应该还能加上去呀。
----------------
随后又让无符号的 unsigned short -1后发现,居然能变成-1值来。晕到了。请各位高手们帮忙解析一下。为什么呢
...全文
958 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jingzizhuo 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hityct1 的回复:]
也许是型别自动转换造成的。operator < < 有很多重载形式,很可能是编译器无法识别该用哪个。
强制转换一下:

cout < < "\t\tn_short + 1: " < <(short)(n_short + 1);

或者象第二个程序一样:

n_short=n_short+1;
cout < < "n_short最大值32767后加1: " < < n_short < < endl;
[/Quote]
嗯。你说的也很有理。可是已经结贴了,不然给你加点分。虽然只有区区20分。可是都没有了。后悔了
jingzizhuo 2008-04-12
  • 打赏
  • 举报
回复
我的总结如下。long型和int型,由于占用空间一样的大,所以当int型和long型最大值加一后,结果都是向前循不了。而,short型。如果不进行类型限制,就会向容量更大类型提升。所以在cout对像中,使用了n_short+1,由于没有进行类型限制,所以向上提升了。而采用了n_short=n_short+1时,n_short为short型,所以进行了限制,计算机不会自动向上提升。
hityct1 2008-04-12
  • 打赏
  • 举报
回复
也许是型别自动转换造成的。operator << 有很多重载形式,很可能是编译器无法识别该用哪个。
强制转换一下:

cout<< "\t\tn_short + 1: " <<(short)(n_short + 1);

或者象第二个程序一样:

n_short=n_short+1;
cout << "n_short最大值32767后加1: " << n_short << endl;
jingzizhuo 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jingzizhuo 的回复:]
引用 9 楼 ttkk_2007 的回复:
哥们,我不是跟你说了吗,已经提升了
(n_short + 1),一个short和int型相加,都提升为int了
你字节sizeof(n_short+1)看看,4个字节了,你怎么就不听我的呢
还C++的bug

----------
我知道啊。哦。终于明白了。 出丑了。终于明白了,怪不得
n_short=n_short就不会出现问题。原来它样做,就不会提升。谢谢大侠啊。
[/Quote]
打错了是n_short=n_short+1,不是n_short=n_short
jingzizhuo 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ttkk_2007 的回复:]
哥们,我不是跟你说了吗,已经提升了
(n_short + 1),一个short和int型相加,都提升为int了
你字节sizeof(n_short+1)看看,4个字节了,你怎么就不听我的呢
还C++的bug
[/Quote]
----------
我知道啊。哦。终于明白了。 出丑了。终于明白了,怪不得
n_short=n_short就不会出现问题。原来它样做,就不会提升。谢谢大侠啊。
jingzizhuo 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 arong1234 的回复:]
long和int也应该如此
const long MAX_LONG = (((unsigned long)(~0))>>1);//如果你的long的最大值不等于这个,说明你设置就是错误的

long i = MAX_LONG;
i-1 应该是-MAX_LONG-1
0-1 = -1

int 也一样

当然unsigned 时没有符号位,自然就没有这样

总之你要学会逐位加减法,不懂这个,你就不会明白的,找本计算机原理讲数字在计算机里的表示的书看看

[/Quote]

不明白了。你的说法不不能说明了问题。同样的方法,用在三种类型变量上,得出了不同的计算方法。而这个计算方法只出现在cout对像中。short没有循环,而long和int都循环了。
ttkk_2007 2008-04-12
  • 打赏
  • 举报
回复
哥们,我不是跟你说了吗,已经提升了
(n_short + 1),一个short和int型相加,都提升为int了
你字节sizeof(n_short+1)看看,4个字节了,你怎么就不听我的呢
还C++的bug
jingzizhuo 2008-04-12
  • 打赏
  • 举报
回复
我的分析如下: 在第一个程序代码中,采用了cout对像cout < < "\t\tn_short + 1: " < < (n_short + 1);
进行计算时,没有达到预期的结果,而在第二程序代码,通过n_short=n_short+1。进行计算达到预期的结果。
而同样的问题没有出现在int型和long中.我觉得是cout对像在计算short变量时发生了问题。是C++的BUG。
arong1234 2008-04-12
  • 打赏
  • 举报
回复
long和int也应该如此
const long MAX_LONG = (((unsigned long)(~0))>>1);//如果你的long的最大值不等于这个,说明你设置就是错误的

long i = MAX_LONG;
i-1 应该是-MAX_LONG-1
0-1 = -1

int 也一样

当然unsigned 时没有符号位,自然就没有这样

总之你要学会逐位加减法,不懂这个,你就不会明白的,找本计算机原理讲数字在计算机里的表示的书看看
jingzizhuo 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 arong1234 的回复:]
考虑位上的变化就明白了
signed short, 最大值是0x7FFF再加1后变为8000,这就是-32768
至于0-1,当然就变成了0xFFFF,也就是-1

[/Quote]
可是为什么int和long型。就不同了呢。再就是在第二个代码清单中,为什么又不同了呢。
arong1234 2008-04-12
  • 打赏
  • 举报
回复
考虑位上的变化就明白了
signed short, 最大值是0x7FFF再加1后变为8000,这就是-32768
至于0-1,当然就变成了0xFFFF,也就是-1
ttkk_2007 2008-04-12
  • 打赏
  • 举报
回复
那就是提升为int了
cout << "\t\tn_short + 1: " << sizeof((n_short + 1)); 你输出看看行了,已经是4个字节了
jingzizhuo 2008-04-12
  • 打赏
  • 举报
回复
哦???没发现过这个问题,长见识了!呵呵!
n_short_unsigned=0后减1: 65535是正确的,
n_short最大值32767后加1: -32768
不明白了……
----------------------
C++编译就是这样,当一个整型变量超越了限制,其值就会从范围的另一端取值。使其超越限制是不出错。如
int型变量占用了4字节,取值范围为-2147483648~ 2147483647.如果int型变量加减运算。超过了2147483647。就会从头开始循环。如加1后就变成了-2147483648。加2就是-2147483647
  • 打赏
  • 举报
回复
哦???没发现过这个问题,长见识了!呵呵!
n_short_unsigned=0后减1: 65535是正确的,
n_short最大值32767后加1: -32768
不明白了……
jingzizhuo 2008-04-12
  • 打赏
  • 举报
回复
#include <iostream>
#include <climits>
using namespace std;

int main()
{
short n_short=SHRT_MAX;
unsigned short n_short_unsigned=0;
cout << "n_short= " << n_short;
n_short=n_short+1;
cout << "\nn_short size of " << sizeof(n_short) << " bytes.\n";
cout << "n_short最大值32767后加1: " << n_short << endl;
n_short_unsigned=n_short_unsigned-1;
cout << "n_short_unsigned=0后减1: " << n_short_unsigned;

return 0;
}
编译结果如下:
n_short= 32767
n_short size of 2 bytes.
n_short最大值32767后加1: -32768
n_short_unsigned=0后减1: 65535
==========================
请在看个代码,short型变量又能显示预测的结果。严重不明白了。
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-12 09:03
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下