Flash Ripper RSS Readers

Опасный uint (беззнаковое целое) в ActionScript3

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

var ui:uint = -10000;
trace("ui = " + ui);
// Выводит:
// Warning: 1092: Negative value used where a uint (non-negative) value is expected.
// ui = 4294957296

Но не все такие случаи удается отсечь компилятором. Вот пример ошибки, которая успешно компилируется, но код не работает как ожидается, формально являясь правильным:

var rect:Rectangle = new Rectangle(-1, 1, 1, 1);
var rectX: uint = rect.x; // !Попытка присвоить значение -1 беззнаковому целому!
var rectY: uint = rect.y;
trace("Rectangle X = " + rectX);
trace("Rectangle Y = " + rectY);
// Выводит:
// Rectangle X = 4294967295 // многовато для -1
// Rectangle Y = 1

Выводы делайте сами. Напомню, что использование типа uint не дает преимуществ ни в объеме памяти, ни в скорости. Получается, главное достоинство uint — чистота кода. Но обратная сторона этой медали в том, что код становится более опасным. Хотя это, конечно, не просто все вешающий бесконечный цикл.

UPD: Давно хотел сослаться на эту толковую статью: Василий Нужа о типе uint в ActionScript.

Писал Rost, 15 Ноябрь 2007 16:06

Найдены баги:

Спасибо за предупреждение, обязательно перепишу свой код, а то после твоего поста здесь, уверен, все кинулись не чинить свои ошибки, а пытаться найти подобные у других!

Вред - 15 Ноябрь 2007 17:34

Вред™, дружище, — Вы что, отчаялись заработать на жизнь программированием?

Рост - 15 Ноябрь 2007 17:39

За последний год имел баги из-за этого раз десять.
Однако продолжаю юзать uint, где по логике Number'а быть не должно (например, в индексах или в номере уровня вложенности). Есть надежда, что когда-нибудь разрабочики плеера найдут время на оптимизацию целочисленных операций.

Антон Волков - 15 Ноябрь 2007 20:02

да мне тоже кажется, что это будет соптимизировано и не когда-нибудь,а когда (вдруг? =) ) сильверлайт начнет жеч =))

zz - 15 Ноябрь 2007 21:41

такая же плюшка есть и у нетстрима когда пытаешься загрузить несуществующий файл вместо ожидаемого -1 в totalBytes он отдает uint(-1) (4..четатут..), что согласитесь не особо похоже на -1 :) поэтому нужно делать так: int(myStream.totalBytes) для полного счастья.

__i - 15 Ноябрь 2007 22:00

бред вы несёте однако :) прелесть uint в том, что он остаётся целочиленным, но при этом повышает допустимый предел использования в 2 раза :) к тому же он таки быстрее в большенстве случаев. как бы не звучало горделиво, но эту ошибку я один раз споймав (точнее я специально ставил экперемент. я всегда прежде чем начать испольтзовать класс, пытаюсь вызвать у него все исключения, что бы быть в курсе), больше не повторял, и уверен что не повторю.

BlooDHounD - 15 Ноябрь 2007 22:08

BlooDHounD™, я не сомневаюсь что у тебя все круто :)

Только вот у меня еще не было случая, когда целых чисел не хватало. Зато совсем вчера был случай с прямоугольником, вот я и делюсь душевной болью.

Безбажного кода вам.

Рост - 15 Ноябрь 2007 22:46

И ещё будьте осторожны в том, что ни uint ни int не может быть NaN в отличии от Number.
Лично я иногда делаю делаю проверку типа if(isNaN(someNum)) и после нескольких обжогов осторожничаю.

Pirrest - 15 Ноябрь 2007 23:08

На самом деле юинт везде ведет себя подозрительно
например в с++ отрицательный юинт равен 76

Nirth - 16 Ноябрь 2007 13:59

Представление uint, int... в c++ зависит от:
- платформы (процессора в т.ч.)
- рантайм-обертки (которая создается компилятором)

Во flash это видимо еще одна обертка.
Но имеет смысл использовать uint для:

- хранения флагов
- быстрых операции shl, shr (>>, - битовых логических операций %, /, &

То есть там где стопудово должно быть uint - лучше использовать uint.
Баги и грабли - будут, они всегда есть с появлением чего-то нового в языке.

yoyo - 16 Ноябрь 2007 14:58

Все умные такие, а потом в других блогах кричат помогите исправить... хоть бы ники меняла, но я пальцем ни на кого тыкать не буду!

Сделка - 16 Ноябрь 2007 15:47

Надеюсь не про этот ник :) и я - не она
Да и вероятность совпадения ников велика.

yoyo - 16 Ноябрь 2007 16:03

Это спамер

Nirth - 16 Ноябрь 2007 16:54

Тип int не менее опасен :)

var a:Array = [3000000000];
var b:int = a[0];
trace(b);

Вместо обещанных трёх мильёнов получаем -1294967296.
А представляете, если вы считали чьи-то бабки?
А представьте, что эту разницу вам придётся компенсирвоать? :)

Dan - 17 Ноябрь 2007 1:20

XRumer 4.0 is the best program for promotion!
It's have CAPTCHA recognizer, email verificator, and a lot of other functions...

But. I forgot link to it :(

Can you give me URL to the xrumer description? screenshots, etc.

Thank you

XRumakTheBest - 17 Ноябрь 2007 9:49

Друзья, спасибо, много полезного узнал. Да, и прошу не расценивать эту запись как манивест проив uint. Я продолжаю активно ипользовать его в своем коде.

Рост - 17 Ноябрь 2007 15:48

uint использую только для ARGB и RGBA

a_[w] - 19 Ноябрь 2007 1:09



Это запись из категории 'AS3'. 10 еще cвежих:

Архивы по категориям:

3D-18, Adobe AIR-30, Animation-1, Apache Ant-1, Architecture-1, ARP-1, Art-25, Articles-26, AS3-52, Books-7, Business-3, Cairngorm-2, CI-1, Classes-10, Coding-30, Community-113, Components-19, Contests-28, Cool-Job-5, Debug-18, Design-26, Development-84, EMO-1, Events-13, Extensions-2, FAQ-8, FDS-1, Flash and html-5, Flash Player-35, Flash Updates-8, Flash-scene-1, flash10-4, FlashLite-2, Flex-30, Flex 2-80, Flickr-1, FMS-1, FPUG-46, frameworks-1, Games-11, Good Job!-35, HaXe-14, Health-2, Humor-10, Ideas-13, JavaScript-1, Job-26, JSFL-8, Links-2, Linux-1, Maps-1, Math-8, Money-11, MXML-1, Open Source-15, Optimization-2, Patterns-2, Personalities-27, Politics-1, Preloading-3, Productivity-9, PureMVC-10, Pv3d-1, Rafpug-4, Red5-3, Remoting-11, Resources-21, Ruby-6, SAAS-1, Security-11, SEO-8, Silverlight-5, Sound-3, Strategy-120, Tamarin-1, Tools-113, Training-2, Trash-8, URAFPUG-13, Urgent-1, Usability-6, Video-6, VoIP-5, Wallop-1, Wishlist-2, Архив всех записей (большой)

За последние месяцы:

Июл 2008: Международная встреча разработчиков URAFPUG завершена, URAFPUG - трансляция студии Flex-фреймворка Mate, весь Июл

Июн 2008: Попытка предварительных выводов о встрече аниматоров, Онлайн трансляция встречи аниматоров в Донецке, весь Июн

Май 2008: Если 3D, то по-взрослому: официальный запрос в Adobe по поводу контроля над мип-маппингом. Нужна ваша поддержка!, В этом году «Russian Flash Awards» пройдет в «космическом стиле», весь Май

Апр 2008: Программирование под флэш платформу. Cтатья (местами спорная), Advanced Flash Components бесплатно раздает все свои AS2-компоненты, весь Апр

Мар 2008: Зарплаты программистов в 2007 году, FlashPhone как технология года? Технология года? В Рунете?, весь Мар

Фев 2008: ЙА ФПУГ — регистрация на первую встречу UAFPUG продолжается, Закулисы Flex и секрет успеха опенсорс-проекта, весь Фев





Примечания:
Статус документа
: в процессе
   2002-2007 Производство: Рост Прибыли · О проекте · Подписка на новости (RSS)