Почему разница в ширине диапазона точности для десятичной? - PullRequest
3 голосов
/ 16 марта 2019

Как видно из описания MSDN десятичного числа , определенные диапазоны точности имеют одинаковое количество байтов хранения, присвоенных им.

Precision ranges with their respective storage size

Чего я не понимаю, так это того, что существуют различия в размерах диапазона.Как диапазон от 1 до 9 из 5 байтов хранения имеет ширину 9, в то время как диапазон от 10 до 19 из 9 байтов хранения имеет ширину 10. Тогда следующий диапазон из 13 байтов хранения снова имеет ширину 9, тогда какследующий снова имеет ширину 10.

Поскольку байты памяти увеличиваются на 4 каждый раз, я ожидал бы, что все диапазоны будут одинаковой ширины.Или, может быть, первый, который будет меньше, чтобы зарезервировать место для знака или чего-то еще, но с тех пор на равной ширине.Но с 9 до 10 до 9 до 10 снова.

Что здесь происходит?И если бы он существовал, имел бы 21 байт хранения диапазон точности 39-47, т. Е. Это шаблон 9-10-9-10-9-10 ...?

1 Ответ

3 голосов
/ 16 марта 2019

будет 21 байт хранения иметь диапазон точности 39-47

Нет.2 ^ 160 = 1,461,501,637,330,902,918,203,684,832,716,283,019,655,932,542,976 - который имеет 49 десятичных цифр.Таким образом, этот гипотетический сценарий будет обслуживать диапазон точности 39-48 (так как 20-байтовое целое число не будет достаточно большим, чтобы содержать любые 49-значные числа больше этого)


Первый байт зарезервирован длязнак.

01 используется для положительных чисел;00 для отрицательного значения.

Остальное хранит значение в виде целого числа.т. е. 1.234 будет храниться в виде целого числа 1234 (или кратного 10 от этого, в зависимости от объявленной шкалы)

Длина целого числа равна либо 4, 8, 12 или 16 байта в зависимости от заявленной точности.Некоторые целые числа 10 могут быть сохранены в байтах 4, однако, чтобы получить весь диапазон, это может быть переполнено, поэтому необходимо перейти к следующему шагу вверх.

и т. Д.

  • 2^32 = 4,294,967,295 (10 цифр)
  • 2^64 = 18,446,744,073,709,551,616 (20 цифр)
  • 2^96 = 79,228,162,514,264,337,593,543,950,336 (29цифры)
  • 2^128 = 340,282,366,920,938,463,463,374,607,431,768,211,456 (39 цифр)

Вам нужно использовать DBCC PAGE, чтобы увидеть это, приведение столбца к binary не дает представление о хранилище.Или используйте такую ​​утилиту, как просмотрщик внутренних объектов SQL Server.

   CREATE TABLE T(
   A DECIMAL( 9,0), 
   B DECIMAL(19,0),
   C DECIMAL(28,0)  ,
   D DECIMAL(38,0) 
   );

   INSERT INTO T VALUES
   (999999999, 9999999999999999999, 9999999999999999999999999999, 99999999999999999999999999999999999999),
   (-999999999, -9999999999999999999, -9999999999999999999999999999, -99999999999999999999999999999999999999);

Показывает первую строку, сохраненную как

enter image description here

И вторую как

enter image description here

Обратите внимание, что значения после знакового бита инвертированы в байтах.0x3B9AC9FF = 999999999

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...