MSDN description of decimal显而易见,某些精度范围具有分配给它们的相同数量的存储字节。
我不明白的是,范围的大小存在差异。从5个存储字节的1到9的范围的宽度为9,而从9个存储字节的10到19的范围如何为10的宽度。那么下一个13个存储字节的范围又为9的宽度,而下一个的宽度再次为10。
由于每次存储字节增加4,所以我希望所有范围都具有相同的宽度。或者,第一个较小的可以为标牌或其他东西保留空间,但此后宽度相等。但是它又从9降到10,再到9到10。
这是怎么回事?如果存在的话,21个存储字节的精度范围是否为39-47,即模式9-10-9-10-9-10 ...?
答案 0 :(得分:3)
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);
显示存储为
的第一行第二个是
请注意,符号位之后的值将字节反转。 0x3B9AC9FF
= 999999999