mysql 最高位 是 1 还是 0 , 当列设计为 signed int

mysql highest bit Whether is 1 or 0 , when column is designed signed int

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

  1. 以下是我的SQL演示:
create table test
(
    a int not null primary key,
    b varchar(20) not null
);

insert into test values (-4, 'aaa');
insert into test values (5,  'bbb');
  1. 通过 hexdump
  2. 将 test.ibd 转为 txt
[root@xxxxx test2]# hexdump -C -v /usr/local/mysql/data/test2/test.ibd > test.txt
  1. /usr/local/mysql/data/test2/test.txt

  1. 所以,为什么存储负数时最高位是0

    我很困惑它与 C/C++ 不同。

  2. 其他信息

    mysql版本:5.8 引擎:innodb

首先,您的create table代码与您的数据不匹配,您需要将列定义为signed,而不是unsigned(否则你显然不能存储负值)。

InnoDB 通过 设置 最高有效位存储正 有符号 整数:请注意,在您的示例中,值 5存储为 80 00 00 05,而不是 00 00 00 05。负值仍然使用补码表示,但未设置最高有效位。

因此,要从字节值(解释为无符号整数)到有符号值,您可以将其视为从中减去偏移量 80 00 00 00。例如。 7f ff ff fc 作为 unsigned 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 00 05)。