当存储负数时,为什么最高位是0?
create table test
(
a int unsigned not null primary key,
b varchar(20) not null
);
insert into test values (-4, 'aaa');
insert into test values (5, 'bbb');
[root@xxxxx test2]# hexdump -C -v /usr/local/mysql/data/test2/test.ibd > test.txt
那么,当存储负数时,为什么最高位是0。
我搞不清它和C/C++有什么不同。
其他信息
mysql版本:5.8引擎:innodb
首先,您的create table
代码与您的数据不匹配,您需要将列定义为有符号的,而不是无符号的(否则您显然不能存储负值)。
InnoDB通过设置最高有效位来存储正有符号整数:请注意,在您的示例中,值5
存储为80 00 00 05
,而不是00 00 0005
。负值仍然使用补码表示,但具有未设置的最高有效位。
因此,要从字节值(解释为无符号int)到有符号值,您可以将其视为减去偏移量80 00 00 00
。例如。7f ff ff fc
作为无符号的int将是2 147 483 644,减去2 147 483 648将是-4。此外,如果只按字节排序,则会得到7f ff ff fc
(-4
)...7f ff ff ff
(-1
)...80 00 00 00
(0
)...80 00 00 05
(5
)。
请注意,无符号整数按常规存储(例如,5
存储为00 00 0005
)。