提问者:小点点

当列设计为符号int时,mysql最高位是1还是0


当存储负数时,为什么最高位是0?

  1. 以下是我的SQL演示:
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


共1个答案

匿名用户

首先,您的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)。