2012-03-02 36 views
1

我需要獲取某個類型的數據位寬。我怎麼弄到的? 例如,我如何編寫一個函數如下?如何獲取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 
+2

您是否試圖獲取值的*符號*,或者值是否爲* signed *類型? – Gabe 2012-03-02 01:54:45

+0

我需要得到,如果類型是簽名類型或不。 – prosseek 2012-03-02 02:01:27

+0

@prosseek這就是爲什麼我們使用有意義的變量名稱 - 請參閱M.Babcock對我的回答的評論:-) – 2012-03-02 02:03:15

回答

4

對於尺寸,你可以使用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()) 
      ); 
    } 
} 
+0

雖然'sign'有點模棱兩可我可能會用'isPositive'之類的東西。 – 2012-03-02 01:57:24

+0

同意有意義的變量名稱。 「符號」是他的。 – 2012-03-02 02:02:27

+0

忽略了這一點,夠公平的。 – 2012-03-02 02:03:08

2

@ ChrisShain的答案第一部分正確。假設你可以保證t是一個數字類型,爲了判斷類型是否有符號,你應該能夠使用表達式樹來動態調用t上的const字段,將其轉換爲一個bitarray並檢查它是否使用符號位(或者只是使用bitshift魔術來測試它而不進行轉換)。我沒有這樣做,但它應該是可行的。如果你想要一個例子,我可以解決它。

或者像其他人那樣使用switch聲明(或系列if)輕鬆實現。

相關問題