有没有一种简单的方法可以将32位整数转换为16位整数?

4

我有一个32位的整数,我想只访问这个变量的低16位。我知道可以将其转换为位数组和int16,但是否有更直接的方法?

6个回答

8
如果您只需要下半部分,您可以直接转换它:(Int16)my32BitInt 通常,如果您像这样扩展/截断位模式,则确实需要注意有符号类型 - 无符号类型可能会导致更少的意外情况。
如评论中所述 - 如果您将代码封装在“checked”上下文中,或者更改了编译器选项以使默认为“checked”,则如果丢弃任何非零位,则无法截断此类数字而不抛出异常 - 在这种情况下,您需要执行:
(UInt16)(my32BitInt & 0xffff)

在这种情况下,使用有符号类型的选项已经消失了,因为您必须使用 & 0x7fff ,这只保留了15位。

如果my32BitInt太大,这将抛出OverflowException异常。 - Luaan
1
只有在checked上下文中才会出现异常-这不是C#的默认行为。 - Will Dean
在未经检查的上下文中,它会做什么?OP想要数字的低16位。未经检查是否能给你这个? - Luaan
不错。然而,“checked”是默认值(或者说,它取决于编译器选项)。你应该在你的示例中添加“unchecked”上下文。使用“unchecked((Int16)my32BitInt)”即可,而且它不依赖于编译器选项 :) - Luaan
1
“checked” 不是我使用过的任何版本的 VS 的默认设置。 - Will Dean
是的,我用LINQPad试过了,它默认支持。但是,这种代码应该始终明确地调用一个未经检查的上下文,因为它明确不关心溢出。这里的语义很重要,而不是实际执行。 - Luaan

2

只需使用此函数

Convert.ToInt16()

或者只是
  (Int16)valueasint

2
如果值太大或太小,这将抛出异常而不是修剪。 - Rawling
我认为这会导致溢出异常。 - Harrison
在任何情况下,您都将收到OverflowException。 - BRAHIM Kamel
@JulieShannon,这只会在checked上下文中发生。在未经检查的上下文中,算术溢出被忽略并截断结果。 - Harrison

1
您可以使用隐式转换将implicit conversation转换为Int16,例如:
(Int16)2;

但是,在进行此操作时要小心。因为Int16无法保存所有可能的Int32值。

例如,以下操作将无法正常工作:

(Int16)2147483683;

因为 Int16 最大只能容纳 32787 的值。您可以使用 unchecked (C# Reference) 关键字来处理这种情况。

1
如果你强行执行未经检查的操作,那么强制类型转换应该可以解决问题:
int r = 0xF000001;
short trimmed = unchecked((short) r);

这将截断r的值以适应short类型。

如果r的值始终应该适合一个short,您可以进行正常转换并让抛出异常。


0
如果你需要一个16位的值,并且你碰巧知道一些具体的信息,比如这个数字永远不会小于零,那么你可以使用一个UINT16值。转换的代码如下所示:
 int x = 0;
 UInt16 value = (UInt16)x;

这个变量具有整数的完整(正)范围。


0
首先,请确保您确实希望该值被签名。 uintushort 的存在是有原因的。然后:
ushort ret = (ushort)(val & ((1 << 16) - 1));

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