2015-07-03 15 views
5

İmzalı tam sayıların işaretlenmemiş alanlara dönüştürülmesi, bunların aralıklarının ve sırasının korunması sorunuyla karşı karşıya geliyorum. Aşağıdaki tanım göz önüne alındığındaİmzalı tamsayı aralıkları işaretsiz olarak işaretlendi

:

#include <limits> 

#define MIN(X) std::numeric_limits<X>::min(); 
#define MAX(X) std::numeric_limits<X>::max(); 

imzalı dizi harita için en hızlı ve doğru yolu nedir [MIN (T) MAX (T)] imzasız aralığa[0, MAX (U)]?

:

T tamsayı tip

U == işaretsiz bir tamsayı türü

sizeof (T) 'dir sizeof (U)

Başarısız bir çözüm bulmak için çeşitli bit twiddling ve sayısal yöntemler.

+1

_ "İmzalı tam sayıların imzasızlara dönüştürülüp, aralıklarının korunacağı bir sorunla karşı karşıyayım" _ Er, -1'den ne beklediniz? Menzili korumaya çalışıyorsun ama gerçek değeri değil mi? Ya da ne? Ve _what_ "çeşitli yöntemler" sizin için çalışmadı? Hangi şekilde işe yaramadılar? (bu bağlamda "başarı olmadan" nedir?) Belirli bir yaklaşım hakkında özel bir soru sorun. –

+0

Eğer menzili korursanız, değeri korur çünkü bir değer menzil içindeki pozisyonu ile tanımlanır. Eğer soruyu okursanız açık bir şekilde, -MAX (T) 0 olur. Yani -1, MAX (U)/2 - 1 olur. – plasmacel

+0

@plasmacel Son yorumunuzdaki niyeti açıklamak için sorunuzu düzenlemenizi öneririm . Genel olarak, ABC'yi XYZ'ye eşlemek, örneğin A-> X, B-> Z, C-> Y ile karşılanır. –

cevap

6
unsigned int signedToUnsigned(signed int s) { 
    unsigned int u = 1U + std::numeric_limits<int>::max(); 
    u += s; 
    return u; 
} 

Live example here

Bu [MIN(int), MAX(int)] sağlamak için signed int için signed_max + 1 katacak Neden Bu cevap çalışması ve düzgün harita olurdu [0, MAX(unsigned int)]


eşleştirilmiş:

sen eklediğinizde imzalı bir integral numarası t o imzasız, imzalı bir numara imzasız türüne terfi ettirilir. Hedef tür işaretsiz ise, Bölüm 4.7 kaynaktan [conv.integral]

, elde edilen değer, kaynak tamsayıya uyumlu en az işaretsiz bir tamsayı (modülo n kullanılan bit sayısı 2 n imzasız türü temsil etmek için). [ Not: İkinin tamamlayıcı sunumunda, bu dönüşüm kavramsal olarak şeklindedir ve bit modelinde herhangi bir değişiklik yoktur ( kesilmesi yoksa). —kend notu]

+2

Fiyat standardında mükemmel bir açıklama. – namezero

+1

Gerçekten de istediğim şey! – plasmacel

+1

@plasmacel sizin belirttiğiniz gibi, isteğe bağlı integral türlerini, 'std ::: make_unsigned' ve küçük bir yaratıcı SFINAE' nin doğru kullanımı ile bunu genel bir şablon olarak yapmak da mümkün olduğunu söyleyerek bırakacağım. – WhozCraig

İlgili konular