2016-12-09 2 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; 
} 

у меня есть, что гарантируем для знаковое целое всегда больше или равно, чем целое число без знака в байтах, поэтому никакие данные не должны быть потеряны из-за недостатка места.

ответ

6

Нет, у вас нет такой гарантии: [conv.integral]

2 Если тип назначения без знака, полученное значение наименьшее целое число без знака конгруэнт к источнику integer (по модулю 2^n, где n - количество бит, используемых для представления неподписанного типа). [Примечание: в двухзначном представлении-дополнении 2 это преобразование является концептуальным и нет изменений в битовой схеме (если нет без усечения). -end note]

3 Если тип назначения подписан, значение не изменяется, если оно может быть представлено в типе назначения; в противном случае, значение определено в реализации.

+2

Или, наоборот, да, у вас есть эта гарантия, если ваше значение не превышает диапазон того, что вы делаете. – UKMonkey

Смежные вопросы