Aracılığıyla paylaş


SafeInt sınıfı

Tamsayı taşması önlemeye yardımcı olmak için tamsayı ilkel genişletir ve, farklı türde tamsayılar karşılaştırmanızı sağlar.

template<typename T, typename E = _SAFEINT_DEFAULT_ERROR_POLICY>
class SafeInt;

Parametreler

Şablon

Description

T

Tamsayı veya Boole parametresi türü, SafeInt yerini alır.

E

İlke işleme hatasını tanımlayan bir numaralandırılmış veri türü.

U

Tamsayı veya Boole parametresi için ikinci işlenenin türü.

Parametre

Description

rhs [in]

Bir girdi parametresini tek başına birkaç işlevlerinde işlecinin sağ tarafındaki değeri temsil eder.

[de] ı

Bir girdi parametresini tek başına birkaç işlevlerinde işlecinin sağ tarafındaki değeri temsil eder.

bit]

Bir girdi parametresini tek başına birkaç işlevlerinde işlecinin sağ tarafındaki değeri temsil eder.

Üyeler

Dd570021.collapse_all(tr-tr,VS.110).gifOrtak Oluşturucusu

Ad

Description

SafeInt::SafeInt

Varsayılan Oluşturucu.

Dd570021.collapse_all(tr-tr,VS.110).gifAtama operatörleri

Ad

Sözdizimi

=

template<typename U>

SafeInt<T,E>& operator= (const U& rhs)

=

SafeInt<T,E>& operator= (const T& rhs) throw()

=

template<typename U>

SafeInt<T,E>& operator= (const SafeInt<U, E>& rhs)

=

SafeInt<T,E>& operator= (const SafeInt<T,E>& rhs) throw()

Dd570021.collapse_all(tr-tr,VS.110).gifAtama operatörleri

Ad

Sözdizimi

bool

operator bool() throw()

char

operator char() const

imzalı char

operator signed char() const

unsigned char

operator unsigned char() const

__int16

operator __int16() const

İmzasız __int16

operator unsigned __int16() const

__int32

operator __int32() const

İmzasız __int32

operator unsigned __int32() const

long

operator long() const

imzasız uzun

operator unsigned long() const

__int64

operator __int64() const

unsigned __int64

operator unsigned __int64() const

wchar_t

operator wchar_t() const

Dd570021.collapse_all(tr-tr,VS.110).gifKarşılaştırma işleçleri

Ad

Sözdizimi

<

template<typename U>

bool operator< (U rhs) const throw()

<

bool operator< (SafeInt<T,E> rhs) const throw()

>=

template<typename U>

bool operator>= (U rhs) const throw()

>=

Bool operator>= (SafeInt<T,E> rhs) const throw()

>

template<typename U>

bool operator> (U rhs) const throw()

>

Bool operator> (SafeInt<T,E> rhs) const throw()

<=

template<typename U>

bool operator<= (U rhs) const throw()

<=

bool operator<= (SafeInt<T,E> rhs) const throw()

==

template<typename U>

bool operator== (U rhs) const throw()

==

bool operator== (bool rhs) const throw()

==

bool operator== (SafeInt<T,E> rhs) const throw()

!=

template<typename U>

bool operator!= (U rhs) const throw()

!=

bool operator!= (bool b) const throw()

!=

bool operator!= (SafeInt<T,E> rhs) const throw()

Dd570021.collapse_all(tr-tr,VS.110).gifAritmetik işleçler

Ad

Sözdizimi

+

const SafeInt<T,E>& operator+ () const throw()

-

SafeInt<T,E> operator- () const

++

SafeInt<T,E>& operator++ ()

--

SafeInt<T,E>& operator-- ()

%

template<typename U>

SafeInt<T,E> operator% (U rhs) const

%

SafeInt<T,E> operator% (SafeInt<T,E> rhs) const

%=

template<typename U>

SafeInt<T,E>& operator%= (U rhs)

%=

template<typename U>

SafeInt<T,E>& operator%= (SafeInt<U, E> rhs)

*

template<typename U>

SafeInt<T,E> operator* (U rhs) const

*

SafeInt<T,E> operator* (SafeInt<T,E> rhs) const

*=

SafeInt<T,E>& operator*= (SafeInt<T,E> rhs)

*=

template<typename U>

SafeInt<T,E>& operator*= (U rhs)

*=

template<typename U>

SafeInt<T,E>& operator*= (SafeInt<U, E> rhs)

/

template<typename U>

SafeInt<T,E> operator/ (U rhs) const

/

SafeInt<T,E> operator/ (SafeInt<T,E> rhs ) const

/=

SafeInt<T,E>& operator/= (SafeInt<T,E> i)

/=

template<typename U>

SafeInt<T,E>& operator/= (U i)

/=

template<typename U>

SafeInt<T,E>& operator/= (SafeInt<U, E> i)

+

SafeInt<T,E> operator+ (SafeInt<T,E> rhs) const

+

template<typename U>

SafeInt<T,E> operator+ (U rhs) const

+=

SafeInt<T,E>& operator+= (SafeInt<T,E> rhs)

+=

template<typename U>

SafeInt<T,E>& operator+= (U rhs)

+=

template<typename U>

SafeInt<T,E>& operator+= (SafeInt<U, E> rhs)

-

template<typename U>

SafeInt<T,E> operator- (U rhs) const

-

SafeInt<T,E> operator- (SafeInt<T,E> rhs) const

-=

SafeInt<T,E>& operator-= (SafeInt<T,E> rhs)

-=

template<typename U>

SafeInt<T,E>& operator-= (U rhs)

-=

template<typename U>

SafeInt<T,E>& operator-= (SafeInt<U, E> rhs)

Dd570021.collapse_all(tr-tr,VS.110).gifMantıksal işleçler

Ad

Sözdizimi

!

bool operator !() const throw()

~

SafeInt<T,E> operator~ () const throw()

<<

template<typename U>

SafeInt<T,E> operator<< (U bits) const throw()

<<

template<typename U>

SafeInt<T,E> operator<< (SafeInt<U, E> bits) const throw()

<< =

template<typename U>

SafeInt<T,E>& operator<<= (U bits) throw()

<< =

template<typename U>

SafeInt<T,E>& operator<<= (SafeInt<U, E> bits) throw()

>>

template<typename U>

SafeInt<T,E> operator>> (U bits) const throw()

>>

template<typename U>

SafeInt<T,E> operator>> (SafeInt<U, E> bits) const throw()

>> =

template<typename U>

SafeInt<T,E>& operator>>= (U bits) throw()

>> =

template<typename U>

SafeInt<T,E>& operator>>= (SafeInt<U, E> bits) throw()

&

SafeInt<T,E> operator& (SafeInt<T,E> rhs) const throw()

&

template<typename U>

SafeInt<T,E> operator& (U rhs) const throw()

& =

SafeInt<T,E>& operator&= (SafeInt<T,E> rhs) throw()

& =

template<typename U>

SafeInt<T,E>& operator&= (U rhs) throw()

& =

template<typename U>

SafeInt<T,E>& operator&= (SafeInt<U, E> rhs) throw()

^

SafeInt<T,E> operator^ (SafeInt<T,E> rhs) const throw()

^

template<typename U>

SafeInt<T,E> operator^ (U rhs) const throw()

^=

SafeInt<T,E>& operator^= (SafeInt<T,E> rhs) throw()

^=

template<typename U>

SafeInt<T,E>& operator^= (U rhs) throw()

^=

template<typename U>

SafeInt<T,E>& operator^= (SafeInt<U, E> rhs) throw()

|

SafeInt<T,E> operator| (SafeInt<T,E> rhs) const throw()

|

template<typename U>

SafeInt<T,E> operator| (U rhs) const throw()

|=

SafeInt<T,E>& operator|= (SafeInt<T,E> rhs) throw()

|=

template<typename U>

SafeInt<T,E>& operator|= (U rhs) throw()

|=

template<typename U>

SafeInt<T,E>& operator|= (SafeInt<U, E> rhs) throw()

Notlar

SafeInt Karşı matematiksel işlemler tamsayı taşması class korur. Örneğin, iki 8 bitlik tamsayılar eklemeyi düşünün: bir değeri 200 ve ikinci 100 değeri vardır. Doğru matematiksel işlem olurdu 200 + 100 = 300. Ancak, 8-bit tamsayı sınırı nedeniyle üst bit kaybolur ve derleyici 44 döndürecektir (300-28) sonucu olarak. Bu matematiksel denklem üzerinde bağlıdır herhangi bir işlem beklenmeyen davranış üretecektir.

SafeInt Sınıf kodu olup sıfıra çalışır veya olup aritmetik taşma oluşur denetler. Her iki durumda da, olası sorunu program uyarmak için hata işleyicisi sınıfı çağırır.

Bu sınıf Ayrıca, iki farklı türde tamsayılar oldukları sürece karşılaştırmanızı sağlar SafeInt nesneler. Genellikle, bir karşılaştırma yaptığınızda sayıları aynı türde olması önce dönüştürmeniz gerekir. Genellikle bir sayıyı başka bir türüne çevrim, hiçbir veri kaybı olduğundan emin olmak için denetler gerektirir.

Matematik ve karşılaştırma işleçleri tarafından desteklenen işleçleri tabloda bu konudaki SafeInt sınıfı. En matematiksel işleçler dönmek bir SafeInt nesne türü T.

Karşılaştırma işlemleri arasında bir SafeInt ve her iki yönde tamsayı türü gerçekleştirilebilir. Örneğin, hem de SafeInt<int>(x) < y ve y > SafeInt<int>(x) geçerli olduğunu ve aynı sonucu verecektir.

Birçok ikili işleçler, iki farklı desteklemeyen SafeInt türleri. Bunun bir örneği & işleci. SafeInt<T, E> & intdesteklenir, ancak SafeInt<T, E> & SafeInt<U, E> değil. İkinci örnekte, derleyici parametresi dönmek için ne tür bilmez. Bu sorunun bir çözümü, ikinci parametre taban tipine artığını sağlamaktır. Aynı parametreleri kullanarak bu ile yapılabilir SafeInt<T, E> & (U)SafeInt<U, E>.

Not

Bitsel herhangi bir işlem için iki değişik parametrelerle aynı boyutta olması gerekir.Boyutları farklıysa, derleyici yaratacak bir ASSERT (MFC) özel durum.Bu işlemin sonuçları doğru olması garanti edilemez.Bu sorunu çözmek için daha büyük parametresi ile aynı boyutta oluncaya kadar küçük parametre artığını.

Kaydırma işleçleri için şablon türü için mevcut olandan daha fazla bit kaydırma, onaylama işlemi özel durum oluşturur. Bu yayın modunda hiçbir etkisi olmaz. İki tür parametreleri SafeInt karıştırma dönüş türü özgün türü ile aynı olduğu için kaydırma operatörleri için mümkündür. Sağ tarafındaki işleci yalnızca kaydırmak için kullanılan bit sayısını gösterir.

Bir SafeInt nesnesi ile mantıksal bir karşılaştırma yaptığınızda karşılaştırma kesinlikle aritmetik. Örneğin, bu ifadeler göz önünde bulundurun:

  • SafeInt<uint>((uint)~0) > -1

  • ((uint)~0) > -1

İlk ifade çözümler true, ancak ikinci ifade çözümler false. Bitsel Negatiflik 0 olarak 0xFFFFFFFF kullanılır. İkinci ifade varsayılan karşılaştırma işleci 0xFFFFFFFF olarak 0xFFFFFFFF karşılaştırır ve bunları eşit olduğunu varsayar. Karşılaştırma işleci için SafeInt sınıfı, birinci parametre imzasız iken, ikinci parametre negatif olabileceğinin farkındadır. Bu nedenle, bit gösterimine aynıdır, ancak SafeInt mantıksal işleç olabileceğinin farkındadır işaretsiz tamsayı -1'den büyükse.

Siz kullanırken dikkatli olun SafeInt ile birlikte sınıf ?: Üçlü operatör. Aşağıdaki kod satırını düşünün.

Int x = flag ? SafeInt<unsigned int>(y) : -1;

Derleyici onu şuna dönüştürür:

Int x = flag ? SafeInt<unsigned int>(y) : SafeInt<unsigned int>(-1);

flag Olan false, derleyici -1 değeri atamak yerine bir özel durum oluşturduğunda x. Bu nedenle, bu davranışı engellemek için kullanmak üzere doğru aşağıdaki satırı kodudur.

Int x = flag ? (int) SafeInt<unsigned int>(y) : -1;

Tve U Boolean türü, karakter tür ya da tamsayı türü atanır. Tür imzalanmış veya imzalanmamış tamsayı ve herhangi bir boyuta 8 bitten 64 bittir.

Not

Ancak SafeInt sınıfı her türlü tamsayı kabul eder, imzasız türlerini daha verimli bir şekilde gerçekleştirir.

Emekanizması işleme hatası, SafeInt kullanır. İki hata işleme mekanizmaları ile SafeInt kitaplığı sağlanmıştır. Varsayılan ilke SafeIntErrorPolicy_SafeIntException, hangi atar bir SafeIntException sınıfı bir hata ortaya çıktığında özel durum. Diğer ilke SafeIntErrorPolicy_InvalidParameter, bir hata oluştuğunda, program durur.

Hata ilkenizi özelleştirmek için iki seçenek vardır. İlk seçenek parametresini ayarlamaktır E oluşturduğunuzda bir SafeInt. Yalnızca bir ilke işleme hatası değiştirmek istediğinizde bu seçeneği kullanın SafeInt. Diğer seçeneği tanımlamaktır _SAFEINT_DEFAULT_ERROR_POLICY , içine önce özelleştirilmiş hata işleme sınıfınızın olmasını SafeInt Kitaplığı. İlke tüm örnekleri için varsayılan hata değiştirmek istediğinizde bu seçeneği kullanın SafeInt kodunuzda sınıfı.

Not

SafeInt kitaplığından hataları işleme özelleştirilmiş bir sınıf kodu hata işleyicisi adlı Denetim vermemelidir.Sonra sonucu hata işleyicisi olarak adlandırılan SafeInt işlem güvenilir olamaz.

Gereksinimler

Başlık: safeint.h

Namespace: msl::utilities

Ayrıca bkz.

Başvuru

SafeIntException sınıfı

Diğer Kaynaklar

Çeşitli destek kitaplıkları sınıfları

SafeInt Kitaplığı