标签: signed

如何将无符号的32位整数转换为MySQL或PHP中的签名?

我在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位算术).

谢谢.

php mysql unsigned signed casting

8
推荐指数
1
解决办法
5078
查看次数

以编程方式确定有符号整数类型的最大值

此相关问题是关于在编译时确定签名类型的最大值:

C问题:off_t(和其他有符号整数类型)的最小值和最大值

但是,我已经意识到在运行时确定有符号类型(例如time_toff_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标准的缺陷.证明我错的任何想法?

c signed overflow

8
推荐指数
1
解决办法
5156
查看次数

Postgres数据类型NUMERIC可以存储签名值吗?

在PostgreSQL中,我想存储已签名的值-999.9- 9999.9.我可以用numeric(5.1)它吗?

或者我应该使用什么类型?

postgresql signed types postgresql-9.1

8
推荐指数
1
解决办法
6576
查看次数

为什么在C语言中每个有符号的int类型都必须有相应的unsigned int类型?

我在Nutshell中读C并发现:

"如果定义了可选的带符号类型(没有前缀u),则需要相应的无符号类型(带有初始u),反之亦然."

该段落是关于具有精确宽度(C99)的整数类型.

c unsigned signed c99 stdint

8
推荐指数
1
解决办法
151
查看次数

在C中使用unsigned int有什么意义?

我认为unsigned int只能存储整数> = 0.但是我尝试将一个负数赋给unsigned int,没有什么特别的事情发生.它似乎存储了没有问题的值.

那么signed和unsigned int之间有什么区别,如果它可以存储任何值,那又有什么意义呢?

c int unsigned signed

8
推荐指数
1
解决办法
796
查看次数

将有符号数与无符号数相乘时,应该使用“mul”还是“imul”?

我发现 和 都mul可以imul用来将有符号数乘以无符号数。

例如:

global _start

section .data
    byteVariable DB -5

section .text
_start:

mov al, 2
imul BYTE [byteVariable]
Run Code Online (Sandbox Code Playgroud)

可以用 替换imulmul结果还是一样(-10)。

有符号数与无符号mul数相乘时和imul完全相同,还是有区别?

x86 assembly unsigned signed multiplication

7
推荐指数
1
解决办法
1万
查看次数

7
推荐指数
2
解决办法
2036
查看次数

如果一个整数默认是有符号的,那么为什么会存在signed关键字呢?

我很好奇为什么存在 signed 关键字,因为我相信大多数整数和其他变量在默认情况下都是有符号的。将 signed 关键字放在 int 之前几乎没有任何作用。它有什么用途,为什么存在?

c c++ unsigned signed

7
推荐指数
1
解决办法
252
查看次数

在std::ssize中,为什么返回decltype(c.size())和ptrdiff_t的common_type?

我想要一个对应于的有符号类型std::size(理想情况下是根据它计算出来的,而不是依赖于另一个可能独立的定义。)自然地,我想到使用std::make_signed_t<std::size_t>.

然而,当我查看时std::ssize,我注意到返回类型是std::common_type_tand std::ptrdiff_tdecltype(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())或者说,为什么不直接使用对应的有符号类型呢?该定义背后的意图是什么?

c++ size signed types c++17

7
推荐指数
0
解决办法
230
查看次数

这种按位转换安全吗?

我遇到一种情况,需要将 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)

c++ signed bit-manipulation unsigned-integer

7
推荐指数
1
解决办法
140
查看次数