我有一个32位的int,我只想解决这个变量的下半部分。我知道我可以转换为位数组和int16,但还有更直接的方法吗?
答案 0 :(得分:7)
你只需要下半部分,你可以投下它:(Int16)my32BitInt
通常,如果你正在扩展/截断这样的位模式,那么你需要注意有符号的类型 - 无符号类型可能会减少意外。
如评论中所述 - 如果您已将代码包含在“已检查”上下文中,或者更改了编译器选项以使默认值为“已检查”,那么您无法在没有例外的情况下截断这样的数字如果丢弃任何非零位,则抛出 - 在这种情况下你需要这样做:
(UInt16)(my32BitInt & 0xffff)
(在这种情况下,使用签名类型的选项已经消失,因为您必须使用& 0x7fff
,然后只保留15位)
答案 1 :(得分:1)
只需使用此功能
Convert.ToInt16()
或只是
(Int16)valueasint
答案 2 :(得分:1)
您可以将隐式会话用于Int16
之类的;
(Int16)2;
但当你这样做时要小心。由于Int16
无法保留所有可能的Int32
值。
例如,这不起作用;
(Int16)2147483683;
因为Int16
可以将32787
作为最大值。您可以使用unchecked (C# Reference)
关键字来处理这种情况。
答案 3 :(得分:1)
如果强制执行未经检查的操作,则应该使用强制转换:
int r = 0xF000001;
short trimmed = unchecked((short) r);
这将截断r
的值以适应简短。
如果r
的值应始终适合short
,则可以进行正常转换并抛出异常。
答案 4 :(得分:0)
首先,请确保您确实希望将值设置为已签名。 uint
和ushort
是有原因的。然后:
ushort ret = (ushort)(val & ((1 << 16) - 1));
答案 5 :(得分:0)
如果你需要一个16位的值,并且你碰巧知道某些特定的东西,那么这个数字永远不会小于零,你可以使用UINT16值。转换看起来像:
int x = 0;
UInt16 value = (UInt16)x;
这具有整数的完整(正)范围。