为什么 -0x80000000的类型是long?

codesnail 2011-01-14 11:52:57
请看一下代码:


using System;

class Run
{
public static void Main()
{
int int_min1= -2147483648;
Console.WriteLine(int_min1); //没有问题

int int_min2= (int)-0x80000000;//如果不加强制转换就报错,说-0x80000000的类型是long,不明白
Console.WriteLine(int_min2);
}
}


难道是 -0x80000000被看成是 0-0x80000000了?因为0x80000000的值超过了int的范围,所以结果的类型就是long?
求解,感谢!
...全文
343 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjh_shy 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 codesnail 的回复:]

引用 1 楼 gomoku 的回复:
对。
bool b = (long)0x80000000 > (long)int.MaxValue; // true

问题是 -0x80000000没有超过int的范围啊。。。。。。
[/Quote]
对于一个有符号的32位的整型来说,他的取值范围是到0x7fffffff,0x80000000显然已经超出的有符号32位整型的范围。0x80000000的二进制表示为 1000 0000 0000 0000 0000 0000 0000 0000 最高位1为符号位。
codesnail 2011-01-14
  • 打赏
  • 举报
回复
我不明白的是为什么 -0x80000000 不被当成一个整体看待。
codesnail 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 vrhero 的回复:]

引用 4 楼 codesnail 的回复:
引用 3 楼 vrhero 的回复:

0x80000000已经把符号位占了...你只能用int.MinValue...


那请问-2147483648和-0x80000000有什么区别,c#在操作上有什么不同?小弟愚钝,请解释详细一下。。。。。

都说了0x80000000把符号位占了,所以有二义性...编译器无法区别,必须加强制转……
[/Quote]

不好意思,-2147483648的符号位没有被占?????
足球中国 2011-01-14
  • 打赏
  • 举报
回复
看错了。是负的。
string s16= Convert.ToString(int.MinValue, 16);//=80000000
0x80000000的二进制 10000000000000000000000000000000 符号位确实占了
向螃蟹致敬。
vrhero 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zanfeng 的回复:]
和占位符没有关系吧。
0x80000000转为十进制2147483648
int的最大值为
public const int MaxValue = 2147483647;
[/Quote]
2147483647=7FFFFFFF...和占位符没有关系,7是怎么来的?
足球中国 2011-01-14
  • 打赏
  • 举报
回复
和占位符没有关系吧。
0x80000000转为十进制2147483648
int的最大值为
public const int MaxValue = 2147483647;
vrhero 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 codesnail 的回复:]
引用 3 楼 vrhero 的回复:

0x80000000已经把符号位占了...你只能用int.MinValue...


那请问-2147483648和-0x80000000有什么区别,c#在操作上有什么不同?小弟愚钝,请解释详细一下。。。。。
[/Quote]
都说了0x80000000把符号位占了,所以有二义性...编译器无法区别,必须加强制转换...
gomoku 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 codesnail 的回复:]
...
问题是 -0x80000000没有超过int的范围啊。。。。。。
[/Quote]

你可以向微软发一个错误报告。
告诉他们C#编译器不够聪明,不能把-0x80000000在一步内推断出它其实就是int.MinValue。
codesnail 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 vrhero 的回复:]

0x80000000已经把符号位占了...你只能用int.MinValue...
[/Quote]

那请问-2147483648和-0x80000000有什么区别,c#在操作上有什么不同?小弟愚钝,请解释详细一下。。。。。
vrhero 2011-01-14
  • 打赏
  • 举报
回复
0x80000000已经把符号位占了...你只能用int.MinValue...
codesnail 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gomoku 的回复:]
对。
bool b = (long)0x80000000 > (long)int.MaxValue; // true
[/Quote]
问题是 -0x80000000没有超过int的范围啊。。。。。。
gomoku 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 codesnail 的回复:]
因为0x80000000的值超过了int的范围,所以结果的类型就是long?
求解,感谢!
[/Quote]

对。
bool b = (long)0x80000000 > (long)int.MaxValue; // true
vrhero 2011-01-14
  • 打赏
  • 举报
回复
其实最主要的原因是...编译器将整数常量默认视为Int32,而-2147483648不超过Int32范围,没有二义性...

而-0x80000000因为符号位的关系,编译器将其视为Int64...
vrhero 2011-01-14
  • 打赏
  • 举报
回复
你怎么还不明白啊...-2147483648的符号位是非常明确的,没有第二种解释...而0x80000000已经被视为无符号整数了,你再加符号位算什么?当然要你来告诉编译器这是个Int32还是Int64了...

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧