2014-02-19 3 views
-5

Я перед беззнаковое целое по вопросу потока т.е. unsigned int x= < max value * max value > при печати х он дает мне -ve значение, даже если она имеет целое число без знакаНеподписанный INT Переполнение

Я готов понимает, как компилятор делает это в качестве отрицательной доли

как мне решить эту проблему ??

заблаговременно

+4

** Где ** [ваш минимальный пример?] (Http://stackoverflow.com/help/mcve) –

+1

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

+1

Добро пожаловать в переполнение стека. Вскоре прочитайте страницу [О программе]. Это очень помогает, если нам не нужно угадывать, какой код вы написали. Посмотрите, как создать MCTRE [Как создать минимальный, полный, проверенный и читаемый пример] (http://stackoverflow.com/help/mcve). Поскольку я должен угадать, я ожидаю, что вы используете 'printf (« u =% d \ n », u);' вместо правильного 'printf (« u =% u \ n », u);', но это должно быть предположение, поскольку вы не дали нам очень много информации для работы вообще. –

ответ

0

Как вы его печатаете? Возможно, используя printf. printf печатает ваши неподписанные int, как если бы они были подписаны (по крайней мере, если вы используете% d). Но это не меняет того факта, что число является неподписанным и, следовательно, положительным.

Вот как вы можете это проверить: сравните его с 0 и посмотрите, что произойдет. Так добавить сразу после printf:

if (x>=0) printf("positive\n"); 
else printf("negative\n"); 

и посмотреть, что происходит.

+0

Позвольте мне рассказать о сценарии, у меня есть устройство, в котором я запускаю более 10 дней, и у меня есть счетчик, который является unsigned int, который подсчитывает количество байтов, которое приходит, но после десяти дней я вижу какой-то негатив, я знаю он становится переполненным, но даже если он переполняется, он должен напечатать отрицательное число справа – Rajiv

+0

@Rajiv - если вы прочтете мой ответ, вы увидите, что печать пишет отрицательный, даже если это положительно, потому что печать считает, что она подписана даже если он неподписан. Таким образом, он печатает негативные, но на самом деле это позитивно. Причина в том, что вы используете 'printf ("% d ")' для печати. Попробуйте вместо этого использовать 'printf ("% u ")', чтобы он знал, что он неподписан. – rabensky

2

Компилятор сам по себе не воспринимает его как знаковое значение, это почти наверняка, потому что вы используете строку формата %d для ее вывода.

Используйте %u один для значений без знака после запятой, и вы видите, что у него есть «правильное» значение (прямо в терминах подписанности, а не справа по величине, что будет неправильно, потому что вы выполнили операцию, ведущую к переполнению).

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