2013-10-27 1 views
0

У меня есть несколько вопросов по поводу следующего кода из книги Delphi FoundationsРазъяснение на числовом форматирования

S := Format('It is %d', [65]); //assigns it to 64 
  1. ли 64 опечатка?

  2. Почему S := Format('%u', [-1]);4294967295?

+0

Есть три вопроса здесь. Пожалуйста, спросите один за раз. Убедитесь, что вопрос завершен. Не ссылайтесь на ресурсы, с которыми вы не можете ссылаться. Если вы собираетесь указывать код, убедитесь, что вы правильно его расшифровываете на 100%. Код в вопросе не компилируется. Наконец, если вы хотите знать, что означает «мирянин», это неправильный сайт. Я предлагаю вам посмотреть это в словаре. –

+0

Я удалил подпись из вашего вопроса. Вопросы автоматически подписываются. Вам не нужно и не следует делать это вручную. –

+0

«Остановитесь, как неясно, что вы просите»? Какой мусор, хотя человек (а не ОП), который полностью отредактировал название моей книги, не помог.Если вы хотите проигнорировать мой ответ из-за моего особого отношения к этому предмету, тогда хорошо, однако Remy Lebeau дал отличный ответ и до того, как я это сделал. –

ответ

3
  1. S := Format('It is %d', [65]) будет производить 'It is 65'. Если в книге говорится иначе, это неправильно.

  2. S := Format('%u', [-1]) производит '4294967295', потому что число форматируется как без знака значения. Подписанный -1 имеет тот же шаблон бита, что и без знака 4294967295 (они оба равны $FFFFFFFF в шестнадцатеричном виде).

  3. Lay person

2

(1) Опечатка - см http://delphifoundations.com/errata/ для этого одного и более (и если вы заметили любые другие себя, я был бы благодарен за обратную связь).

(2) По той причине, что я говорю в книге:

Если знаковое целое пройдена, он просто брошен в беззнаковое целое . Учитывая, что целое число со знаком представлено внутри, , это не просто отключит знак от точки неглубокого лица . Например, Format('%u', [-1]) возвращает '4294967295', а не '1'. Если только отгонка знака - это то, что вы хотите, затем сначала передайте значение Abs стандартной функции: Format('%u', [Abs(-1)]).

Итак, возьмите Integer/Int32 и кардинал/UInt32: экземпляр обоих этих типов занимает 32 бит памяти. Однако в случае Integer/Int32 один из этих битов используется для записи знака (плюс или минус?), Тогда как с кардиналом/UInt32 нет записи для записи; вместо этого этот же бит используется для представления числа, намного большего, чем Integer/Int32. Таким образом, внутреннее представление Int32 (-1) оказывается таким же, как внутреннее представление UInt32 (4294967295).

(3) «мирянин» в этом контексте является просто синонимом «нетехнического человеком», «кто-то, кто не выродок» и т.д.