当前位置: 首页 > 知识库问答 >
问题:

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

龚宏壮
2023-03-14

当存储负数时,为什么最高位是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个答案

靳越
2023-03-14

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

 类似资料:
  • 问题内容: 在Java中,是否保证int始终为32位,而长为64位,而不管体系结构是32位还是64位? 问题答案: Java是平台无关的。所以是32位,并且是64位的。

  • 问题内容: 您将使用哪种方法确定代表2 ^ x的位是1还是0? 问题答案: 我会用: (您也许可以用更少的括号摆脱掉,但我永远不记得按位运算的优先级。)

  • mysql:我现在想做一个用户信息表,字段中有学生学号,请问学号该用int类型还是char类型? 新手

  • 问题内容: 在64位计算机上,Java中的int大小是32位还是64位? 问题答案: 32位。这是Java语言的功能之一,整数的大小不会随基础计算机而变化。请参阅规范的相关部分。

  • 问题内容: 在Swift中,是否可以将最大INT值设置为UITextField? 我的用例是我有5个文本字段,它们需要具有最大的int值。这些值的范围从500一直到10,000。5个不同的文本字段中的每个字段将具有不同的最大值。我不能使用选择器或下拉列表,因为增量将是1。UISlider太难了,无法“擦入”数字。 如果最大int值为5,000,则用户不能(在数字键盘的键盘类型上)输入大于5000的

  • CSV文件通常是如何生成的?用逗号还是分号?你有什么建议吗?