Безопасны ли преднамеренные переполнения? - PullRequest
2 голосов
/ 07 августа 2011

Этот вопрос, вероятно, глупый или параноидальный, но в любом случае :-). Дан следующий код:

DWORD hiRes;

// will overflow about once in an hour
hiRes = GetTickCount() * 1193L;

Если известно, что hiRes периодически переполняется и такие ситуации обрабатываются должным образом, что-то не так с этим кодом?

UPDATE: Результат меня довольно удивляет, так как ответ зависит от типа hiRes (со знаком или без знака), который определяется стандартом C ( см., Например, ).

Ответы [ 2 ]

6 голосов
/ 07 августа 2011

Переполнение unsigned int безопасно. Переполнение подписанного не является (неопределенное поведение).

MSDN говорит:

DWORD - это 32-разрядное без знака целое число (диапазон: от 0 до 4294967295 десятичный). Этот тип объявлен следующим образом:

typedef unsigned long DWORD

Так что это должно быть безопасно.

1 голос
/ 07 августа 2011

Беззнаковые целые числа безопасны, а подписанные - нет.Но я никогда не сталкивался с платформой, которая не дополняет очевидные вещи.Мне бы очень хотелось, чтобы люди, придерживающиеся стандартов, укусили пулю и сделали ее обязательной.

...