Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отличие int от unsigned int, Почему при U получается бесконечный цикл 
:(
    Опции темы
КапельКа
Дата 9.1.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2006

Репутация: нет
Всего: нет



Имеется простой цикл: 
Код

for(j=k; j>=0; j--) { cout<<t[j]; }

Если объявляю переменные как unsigned int, то почему-то после прохождения всего цикла, т.е .когда j=0, цикл не прекращается,  а j становится равным максимальному значению(проверяла дебаггером). Результат получается такой:  11100152834359738363435973836343597383634359738363435973836343597383634359738363435973836343597383634359738361034359738363435973836343597383634359738363435973836343597383634359738363435973836343597383634359738363435973836343597383... ну и так далее.... 
Во всем этом наборе цифр правильные тока первые 6 цифр :111001

А если объявить переменные как int, то все нормально, цикл останавливается как только j становиться раным 0.

Как можно все это объяснить?

Компилятор: VC++6.0
PM MAIL   Вверх
Daevaorn
Дата 9.1.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(КапельКа @  9.1.2007,  13:42 Найти цитируемый пост)
Как можно все это объяснить?

так, что у unsigned (что видно из названия) нет отрицательных значений, поэтому условие >=0 всегда истина.
PM MAIL WWW   Вверх
КапельКа
Дата 9.1.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2006

Репутация: нет
Всего: нет



Я понимаю что unsigned  не может быть меньше 0, я хотела бы понять почему переменая j становиться равной максимальному значению типа unsigned?

Это сообщение отредактировал(а) КапельКа - 9.1.2007, 12:53
PM MAIL   Вверх
Daevaorn
Дата 9.1.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(КапельКа @  9.1.2007,  13:51 Найти цитируемый пост)
я хоткла бы понять почему цикл не прекращается  при unsigned

Цитата(КапельКа @  9.1.2007,  13:42 Найти цитируемый пост)
for(j=k; j>=0; j--) { cout<<t[j]; }

условие j>=0 будет выполнятся всегда.
PM MAIL WWW   Вверх
_hunter
Дата 9.1.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



Цитата(КапельКа @  9.1.2007,  12:51 Найти цитируемый пост)
я хотела бы понять почему переменая j становиться равной максимальному значению типа unsigned?

для этого нужно понимать как числа выглядят в двоичном формате и как выглядят операции над ними.
читать тут


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
КапельКа
Дата 9.1.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2006

Репутация: нет
Всего: нет



т.е. получается как бы движение по кругу диапазона что ли? 
от j  до 0. далее если диапазон продолжается, то идет дальше вниз если нет то начинаеся сначала?

Добавлено @ 13:10 
_hunter,  я в курсе как они выглядят. просто не думала что происходит движение по кругу...

Добавлено @ 13:12 
Тогда еще один вопрос: как можно изменить условие for'a что бы все таки использовать unsigned?
PM MAIL   Вверх
Dancer
Дата 9.1.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: нет
Всего: 37



КапельКа, посмотри в сторону бинарной арифметики, думаю будет понятно.
если же нет, то попробую на пальцах.
unsigned int диапазон от 0 до 0xFFFFh
int диапазон от-0xFFh до (0xFFh -1)
если мы в получаем ноль для unsigned int то есть в двоичном виде это будет 32 нуля. теперь сделай плиз вычитание из этого числа единицы (причём ты не имеешь никакого права добавлять разряды, из у тебя так и должно будет остаться 32) (j--) ты получишь максимальное число для unsigned int.
если ты будешь использовать int то получишь -1 (это вытекает из двоичного представления нуля для no unsigned типов)


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Daevaorn
Дата 9.1.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



j>=0 && j <= k
PM MAIL WWW   Вверх
КапельКа
Дата 9.1.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2006

Репутация: нет
Всего: нет



Огромное всем спасибо. Теперь все стало ясно.
PM MAIL   Вверх
W4FhLF
Дата 9.1.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121





--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.