我需要獲取某個類型的數據位寬。我怎麼弄到的? 例如,我如何編寫一個函數如下?如何獲取C#中的位寬和類型符號?
int x = 30;
Type t = x.GetType();
bool sign = IsSignedType(t); // int is signed type, so it's true
int width = GetWidth(t); // 32
我需要獲取某個類型的數據位寬。我怎麼弄到的? 例如,我如何編寫一個函數如下?如何獲取C#中的位寬和類型符號?
int x = 30;
Type t = x.GetType();
bool sign = IsSignedType(t); // int is signed type, so it's true
int width = GetWidth(t); // 32
對於尺寸,你可以使用Marshal.SizeOf,並在一個字節由位的數量乘以(提示:8),雖然對內置值類型是足夠的,當然更快地只使用可能容易一個案例陳述。我想bool sign = t == Math.Abs(t);
會做。
編輯:
以確定它是否是簽署數,沒有內置的方法,但只有其中的 5:
public static class Application
{
public enum SignedEnum : int
{
Foo,
Boo,
Zoo
}
public enum UnSignedEnum : uint
{
Foo,
Boo,
Zoo
}
public static void Main()
{
Console.WriteLine(Marshal.SizeOf(typeof(Int32)) * 8);
Console.WriteLine(5.IsSigned());
Console.WriteLine(((UInt32)5).IsSigned());
Console.WriteLine((SignedEnum.Zoo).IsSigned());
Console.WriteLine((UnSignedEnum.Zoo).IsSigned());
Console.ReadLine();
}
}
public static class NumberHelper
{
public static Boolean IsSigned<T>(this T value) where T : struct
{
return value.GetType().IsSigned();
}
public static Boolean IsSigned(this Type t)
{
return !(
t.Equals(typeof(Byte)) ||
t.Equals(typeof(UIntPtr)) ||
t.Equals(typeof(UInt16)) ||
t.Equals(typeof(UInt32)) ||
t.Equals(typeof(UInt64)) ||
(t.IsEnum && !Enum.GetUnderlyingType(t).IsSigned())
);
}
}
雖然'sign'有點模棱兩可我可能會用'isPositive'之類的東西。 – 2012-03-02 01:57:24
同意有意義的變量名稱。 「符號」是他的。 – 2012-03-02 02:02:27
忽略了這一點,夠公平的。 – 2012-03-02 02:03:08
@ ChrisShain的答案第一部分正確。假設你可以保證t
是一個數字類型,爲了判斷類型是否有符號,你應該能夠使用表達式樹來動態調用t
上的const字段,將其轉換爲一個bitarray並檢查它是否使用符號位(或者只是使用bitshift魔術來測試它而不進行轉換)。我沒有這樣做,但它應該是可行的。如果你想要一個例子,我可以解決它。
或者像其他人那樣使用switch
聲明(或系列if
)輕鬆實現。
您是否試圖獲取值的*符號*,或者值是否爲* signed *類型? – Gabe 2012-03-02 01:54:45
我需要得到,如果類型是簽名類型或不。 – prosseek 2012-03-02 02:01:27
@prosseek這就是爲什麼我們使用有意義的變量名稱 - 請參閱M.Babcock對我的回答的評論:-) – 2012-03-02 02:03:15