2016-12-09 35 views
6

符号付きの値として関数を渡す必要がある符号なしの値を持っています(関数には触れません)。それが出てきたら私はそれを無署名のものに戻します。私は、キャストの結果がオーバーフロー時に定義された実装であることを知っていますが、(関数ポインタのように)キャストしたときに同じ値になることは少なくとも保証できますか?キャストと符号なしから符号付きへのキャスト

例:

int32_t function_with_default(int32_t a_Default) 
{ 
    // Try some stuff 
    // ... 

    // Fall back to default 
    return a_Default; 
} 

void main() 
{ 
    uint32_t input = UINT32_MAX; 
    uint32_t output = static_cast<uint32_t>(function_with_default(static_cast<int32_t>(input)); 

    // Is is guarenteed to be true? 
    input == output; 
} 

私は符号付き整数は常にバイトの符号なし整数より大きいか等しいので、データはスペース不足のために失われないことをguarenteeを持っています。

答えて

6

いいえ、あなたはそのような保証を持っていない:[conv.integral]

2宛先タイプが符号なしの場合は、結果の値は、少なくとも符号なし整数でありますソースに一致します。 整数(モジュロ2^n、nは符号なしタイプを表すために使用されるビットの数です)。 [注:2の の補数表現では、この変換は概念的であり、ビットパターンには変更がありません( の切り捨てがない場合)。 -end note]

3宛先タイプが符号付きの場合、宛先タイプで表現できる場合は値が変更されません。 の場合、値は実装定義です。

+2

逆に、あなたの値があなたがキャストしている範囲を超えていない限り、あなたはこの保証をします。 – UKMonkey

関連する問題