C#: 如何将 long 转换为 ulong

12
如果我使用BitConverter,它需要一个字节数组,而我没有。我有一个Int32,我想将其转换为UInt32。
在C++中,这没有问题。

有点不明白你在问什么,伙计——longs、byte数组和int类型——能否详细说明一下? - Chris
5个回答

24

只需要简单的强制类型转换,由于在这种情况下会丢失精度,所以转换必须是显式的。

long x = 10;
ulong y = (ulong)x;

8
对于大负数,是否可能发生溢出?可以使用 unchecked 进行截断操作:http://msdn.microsoft.com/zh-cn/library/a569z7k8(VS.71).aspx - Josh Stodola

7

考虑以下函数:

string test(long vLong)
{
    ulong vULong = (ulong)vLong;
    return string.Format("long hex: {0:X}, ulong hex: {1:X}", vLong, vULong);
}

并且这种用法:

    string t1 = test(Int64.MinValue);
    string t2 = test(Int64.MinValue + 1L);
    string t3 = test(-1L);
    string t4 = test(-2L);

这将是结果:
    t1 == "long hex: 8000000000000000, ulong hex: 8000000000000000"
    t2 == "long hex: 8000000000000001, ulong hex: 8000000000000001"
    t3 == "long hex: FFFFFFFFFFFFFFFF, ulong hex: FFFFFFFFFFFFFFFF"
    t4 == "long hex: FFFFFFFFFFFFFFFE, ulong hex: FFFFFFFFFFFFFFFE"

正如您所见,位完全保留,即使对于负值也是如此。


7

尝试:

Convert.ToUInt32()

2

将 long 类型转换为 ulong 类型,只需要进行强制类型转换:

long a;
ulong b = (ulong)a;

C#不会在数字为负数时引发异常。


我不相信这会抛出一个负值的异常,但结果可能并非你所期望的... 我的笔记本上没有安装 .net,否则我会测试一下。 - Tracker1
不会,但第一个比特将被解释为最高有效位而不是符号位。 - DuneCat
它不会抛出异常。你应该考虑修改你的答案,否则可能会误导他人。 - KFL
@KFL 确实。已更新。 - Patrick Hofman
是否抛出异常取决于编译器设置(生成/高级/检查算术溢出/下溢)。为了安全起见,您应该始终像这样包装它:ulong b = unchecked((ulong)a) - adrianm

1
Int32 i = 17;
UInt32 j = (UInt32)i;

编辑:问题不清楚您是有一个长整型还是一个整型?


我认为John指的是C或C++中“旧”的长整型,其宽度为32位。 - Matthew Olenik
我的意思是他出于习惯提到了它。 - Matthew Olenik

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