Hello! On Friday 21 August 2009 18:15:41 Stanislav Maslovski wrote: > В том и дело, что результат сдвига при mask = 0 в правой части > undefined. На моей архитектуре значение всего выражения получается > 0xffffffff, но на другой архитектуре это выражение может запросто дать > 0x00000000. Я уже устал повторять, в чем там загвоздка. Читай мои > письма.
Да, теперь дошло, что сдвиг на 0 бит допустим, а на 32 - нет. Уже нашел в сети, что даже в gcc при разных флагах оптимизации результат разный получается. > > Теперь переписал вычисление маски, чтобы с /32 работало без доп. > > проверки, т.е. > > mask = (u_int32_t)-1 << ( 32 - mask ); > > Новое выражение при mask = 0 в правой части имеет ту же проблему с > undefined result. Но так как ты проверку на 0 уже добавил... > > А при mask = 32, имхо, и старое выражение работало - давало > 0xffffffff. Работало, но оно такое сложное было исключительно ради обработки маски /0 и /32, а только /32 обрабатывается намного проще. Но, как оказалось, лучше бы я сделал явную проверку, раз уж /0 разрешал. > atoi() не возвращает ошибку, strtol() -- возвращает. Ты хочешь, > чтобы работа твоего кода зависела от значения, которое возвращает > atoi() при невозможности сконвертировать строку в число? Твое дело, > код твой, тебе его поддерживать. atoi() в случае ошибки всегда возвращает 0. Собственно, других возможностей просто нет. Т.к. нас не интересует причина некорректности адреса и/или маски, этого достаточно. А маску /0 мы запретили. Возможно, имеет смысл использовать встроенный в эскулайт функции конвертации (именно из соображений переносимости они и встроены). Но функции работы с сетевыми адресами все равно менее переносимы, нежели atoi() Best regards, Alexey Pechnikov. http://pechnikov.tel/

