如何将带符号整数转换为无符号整数?

7
代码片段如下:-
int x = -24;  
uint y = (uint) x;  
Console.WriteLine("*****" + y + "********");  
// o/p is *****4294967272********  

为什么C#会出现这种行为,详细的解释将会有所帮助。谢谢大家。

1
你已经有了可以将int转换为uint的代码,为什么还要问如何进行转换?你想问什么? - Enigmativity
你尝试过使用内置函数Convert.ToUInt32()吗? - Hameed Syed
XY问题是指在解决问题时,人们通常会遇到一些实质性的问题,但由于不了解根本问题,他们会询问有关可能的解决方案,而实际上这些解决方案并不能真正解决问题。这种情况被称为“XY问题”或“X-Y问题”。 - Uwe Keim
3个回答

23

负数(比如 -24)以二进制补码形式表示,详情请参见

zh.wikipedia.org/wiki/二補數

在您的情况下

   24     = 00000000000000000000000000011000
  ~24     = 11111111111111111111111111100111
  ~24 + 1 = 11111111111111111111111111101000 =
          = 4294967272

int 转换为 uint 时要小心,因为 -24 超出了 uint 范围(即[0..uint.MaxValue]),可能会抛出 OverflowException 。更安全的实现方式是

 int x = -24;  
 uint y = unchecked((uint) x); // do not throw OverflowException exception  

正确。按预期工作。 - Grisgram
OP的代码在没有使用unchecked关键字的情况下也能正常工作。 - Enigmativity
好的,它也不会从uint转换为int时引发OverflowException(在不使用checked/unchecked的情况下):D 我想你是对的... - yakya
如果你想在类型转换反向,即uint -> int时抛出OverflowException异常,请尝试以下代码:uint y = 3000000000u; int x = checked((int) y);,因为30亿uint范围内但超出了int范围。 - Dmitry Bychenko
谢谢@DmitryBychenko,这是我需要的详细答案。再次感谢。 - codemilan
显示剩余7条评论

11

有几种方法可以将 int 转换为 uint

int x;

技巧 #1

uint y = Convert.ToUInt32(x);

技巧 #2

uint y = checked((uint) x);

技巧 #3

uint y = unchecked((uint) x);

技巧 #4

uint y = (uint) x;

10
这个答案没有解释正在发生什么以及差异是什么。 - Max Barraclough

-2

尝试下面的代码

int x = -24;  
Console.WriteLine("*****" + Convert.ToUInt32(x) + "********");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接