BigInteger
에서 몇 가지 방법을 살펴볼 필요가있어서 어셈블리에 DotPeeked했습니다.부호에 int를 사용하는 요점은 무엇입니까?
internal int _sign;
왜 당신이 사용하는 것 인 int
숫자의 부호에 대한 : 그리고 나는 오히려 이상한 뭔가를 발견? 아무런 이유가 없거나 내가 빠진 것이 있습니다. 즉, BitArray
또는 bool
또는 byte
을 사용할 수 있습니다. 왜 int
일까요?
BigInteger
에서 몇 가지 방법을 살펴볼 필요가있어서 어셈블리에 DotPeeked했습니다.부호에 int를 사용하는 요점은 무엇입니까?
internal int _sign;
왜 당신이 사용하는 것 인 int
숫자의 부호에 대한 : 그리고 나는 오히려 이상한 뭔가를 발견? 아무런 이유가 없거나 내가 빠진 것이 있습니다. 즉, BitArray
또는 bool
또는 byte
을 사용할 수 있습니다. 왜 int
일까요?
,이 같은 일을 찾을 수 있습니다 :
if ((this._sign^other._sign) < 0)
return this._sign >= 0 ? 1 : -1;
기본적으로 int
유형은 곱셈을 사용하여 두 값의 표시를 비교할 수 있습니다. 분명히 byte
이나 bool
도 허용되지 않습니다.
아직도 질문이 있습니다. 왜 Int16
을 사용하면 적은 메모리를 소비합니까? 이것은 아마 정렬과 연결되어 있습니다.
정렬 된 정수는 약간의 추가 공간을 차지하지만 다른 정수를 곱하거나 비교할 때 및 어셈블리 크기와 정렬이 중요 할 때 성능이 눈에 띄게 향상 될 수 있습니다. –
부호를 int로 저장하면 기호를 단순히 곱하여 계산 결과에 적용 할 수 있습니다. 더 간단한 유형으로 변환 할 때 이것은 유용 할 수 있습니다.
부울은 2 개의 상태 만 가질 수 있습니다. int 형의 장점은 이제 특수 값을 추적하는 간단 것입니다 : 같은 0
public bool get_IsZero()
{
return (this._sign == 0);
}
그리고 몇 가지 더 바로 가기 당신이 코드의 나머지 부분을 읽을 때. 당신은 디 컴파일 코드 _sign
필드의 용도 중 일부를 보면
모든 클래스 개체의 크기는 32 비트 (4 바이트)로 반올림되므로 3 바이트를 절약하면 아무 것도 구입하지 않습니다. 숫자를 저장하는 단어 중 하나에서 비트를 훔쳐 일반 BigInteger 크기에서 4 바이트를 줄일 수 있지만 이러한 사용에 필요한 추가 처리는 32 비트 정수를 낭비하는 비용보다 큽니다.
BigInteger
이 파생 클래스 PositiveBigInteger
및 NegativeBigInteger
인 추상 클래스가 될 가능성이 있습니다. 모든 클래스 객체는 어떤 클래스인지를 나타내는 단어를 가지므로 이러한 접근 방식은 생성 된 각 BigInteger에 대해 32 비트를 절약합니다. 이러한 방식으로 추상 클래스를 사용하면 각 함수 호출에 추가 가상 멤버 디스패치가 추가되지만 대부분의 경우 "if"테스트를 저장할 가능성이 있습니다 (예 : NegativeBigInteger
의 메소드는 this
이 부정적이라면 테스트 할 필요가 없습니다). 이러한 설계는 TinyBigInteger
(값이 Integer
인 BigInteger
) 및 SmallBigInteger
(BigInteger
의 값이 Long
에 들어갈 수있는 경우)의 클래스가 있으면 효율성을 향상시킬 수도 있습니다. 나는 마이크로 소프트가 그러한 디자인을 고려했는지, 또는 그 트레이드 오프가 무엇 이었을지 전혀 모른다.
현재 System.Numerics.BigInteger 개체의 부호 (음수, 양수 또는 0)를 나타내는 숫자를 가져옵니다.
-1이 개체의 값은 음수입니다. 0이 개체의 값은 0입니다. 1이 객체의 값은 양수입니다.의미
class Program
{
static void Main(string[] args)
{
BigInteger bInt1 = BigInteger.Parse("0");
BigInteger bInt2 = BigInteger.Parse("-5");
BigInteger bInt3 = BigInteger.Parse("5");
division10(bInt1);//it is Impossible
division10(bInt2);//it is Possible : -2
division10(bInt3);//it is Possible : 2
}
static void division10(BigInteger bInt)
{
double d = 10;
if (bInt.IsZero)
{
Console.WriteLine("it is Impossible");
}
else
{
Console.WriteLine("it is Possible : {0}", d/(int)bInt);
}
}
}
CLS 존재와 CLS는 지원하지 않기 때문에 바이트 또는 다른 UINT, sbyte, USHORT, 짧은을 사용하지 않는 자신의 컨텍스트는 그것이 문맥없이, 무엇
말하기 어렵다. '타입'이 다른 타입보다 나은 이유는 많이 있습니다. – Greg
정렬은 아마도 어쨌든 32 비트 경계에 'bool'또는 'byte'를 강제합니다. – Joey
@ 그렉 나는 그것이 'BigInteger'에 있다고 말했다. –