我在PHP中有一个字符串(来自某些数据源),它表示格式化的无符号32位整数.我需要将它作为带符号的 32位整数存储到MySQL数据库中,以便稍后我可以从PHP检索它并将其用作(可能为负)有符号整数常量(因为PHP没有无符号整数).
所以,我需要的是一种转换方法,无论是PHP还是MySQL.它不应该依赖于平台(没有endian/32/64位问题).
我知道如何使用MySQL将有符号整数转换为无符号整数:
select CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER);
+------------------------------------------------------+
| CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER) |
+------------------------------------------------------+
| 3232240316 |
+------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
但是我不能反过来工作(注意:MySQL在进行强制转换时使用64位算术).
谢谢.
此相关问题是关于在编译时确定签名类型的最大值:
但是,我已经意识到在运行时确定有符号类型(例如time_t或off_t)的最大值似乎是一项非常困难的任务.
我能想到的最接近解决方案的是:
uintmax_t x = (uintmax_t)1<<CHAR_BIT*sizeof(type)-2;
while ((type)x<=0) x>>=1;
Run Code Online (Sandbox Code Playgroud)
只要type没有填充位,这就避免了任何循环,但是如果type确实有填充位,则强制转换会调用实现定义的行为,这可能是信号或无意义的实现定义转换(例如,剥离符号位).
在我看来,我开始认为问题是无法解决的,这有点令人不安,并且会成为C标准的缺陷.证明我错的任何想法?
在PostgreSQL中,我想存储已签名的值-999.9- 9999.9.我可以用numeric(5.1)它吗?
或者我应该使用什么类型?
我在Nutshell中读C并发现:
"如果定义了可选的带符号类型(没有前缀u),则需要相应的无符号类型(带有初始u),反之亦然."
该段落是关于具有精确宽度(C99)的整数类型.
我认为unsigned int只能存储整数> = 0.但是我尝试将一个负数赋给unsigned int,没有什么特别的事情发生.它似乎存储了没有问题的值.
那么signed和unsigned int之间有什么区别,如果它可以存储任何值,那又有什么意义呢?
我发现 和 都mul可以imul用来将有符号数乘以无符号数。
例如:
global _start
section .data
byteVariable DB -5
section .text
_start:
mov al, 2
imul BYTE [byteVariable]
Run Code Online (Sandbox Code Playgroud)
可以用 替换imul,mul结果还是一样(-10)。
将有符号数与无符号mul数相乘时和imul完全相同,还是有区别?
构建包与生成签名包 android studio 之间的主要区别是什么?
我很好奇为什么存在 signed 关键字,因为我相信大多数整数和其他变量在默认情况下都是有符号的。将 signed 关键字放在 int 之前几乎没有任何作用。它有什么用途,为什么存在?
我想要一个对应于的有符号类型std::size(理想情况下是根据它计算出来的,而不是依赖于另一个可能独立的定义。)自然地,我想到使用std::make_signed_t<std::size_t>.
然而,当我查看时std::ssize,我注意到返回类型是std::common_type_tand std::ptrdiff_t。decltype(c.size())现在c.size()应该是未签名的,但无论哪种情况,它都应该被签名,因为std::ptrdiff_t它是。剩下的就是尺寸了;那应该是两种类型中较大的一个。
我不明白的是为什么你会使用一个大的类型,就像std::ptrdiff_t你想要最大的有符号类型一样。如果它真的是最大的,那就没有意义了std::common_type_t。相反,假设std::common_type_t并不总是返回std::ptrdiff_t,这意味着decltype(c.size())是不同的大小,并且有效地std::ptrdiff_t用于最小大小的有符号类型。如果是这样的话,难道不应该使用最小的有符号类型吗?decltype(c.size())或者说,为什么不直接使用对应的有符号类型呢?该定义背后的意图是什么?
我遇到一种情况,需要将 16 位打包成 64 位数字,然后将它们作为 [ -32768, 32768 ) 范围内的有符号整数读回。我为此选择的方法是将数字计算为有符号 16 位 int,立即将其转换为无符号 16 位 int,然后将其向上转换为 64 位无符号 int,然后执行适当的位移以获得将关键的 16 位放入正确的位置。
这是创建位打包排列的伪代码:
Given int x, y such that x - y >= -32768 and y - x < 32768;
const int MASK_POS = 45;
const unsigned short int u_s = x - y;
unsigned long long int ull_s = u_s;
ull_s <<= MASK_POS;
Run Code Online (Sandbox Code Playgroud)
这是提取原始数字差异的伪代码:
Given unsigned long long int ull_s with 16 bits encoding a signed integer in the 46th …Run Code Online (Sandbox Code Playgroud)