mysql 最高位 是 1 还是 0 , 当列设计为 signed int
mysql highest bit Whether is 1 or 0 , when column is designed signed int
为什么存储负数时最高位为0?
- 以下是我的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');
- 通过 hexdump
将 test.ibd 转为 txt
[root@xxxxx test2]# hexdump -C -v /usr/local/mysql/data/test2/test.ibd > test.txt
- /usr/local/mysql/data/test2/test.txt
所以,为什么存储负数时最高位是0
我很困惑它与 C/C++ 不同。
其他信息
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
)。
为什么存储负数时最高位为0?
- 以下是我的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');
- 通过 hexdump 将 test.ibd 转为 txt
[root@xxxxx test2]# hexdump -C -v /usr/local/mysql/data/test2/test.ibd > test.txt
- /usr/local/mysql/data/test2/test.txt
所以,为什么存储负数时最高位是0
我很困惑它与 C/C++ 不同。
其他信息
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
)。