外壳位移产生不同的数字

Arm*_*enB 5 linux embedded bash shell

在运行时在本地计算机bash中运行:

echo $((192 << 24))
3221225472
Run Code Online (Sandbox Code Playgroud)

但是在我的嵌入式目标忙框上,我得到了其他东西:

echo $((192 << 24))
-1073741824
Run Code Online (Sandbox Code Playgroud)

当我左移较小的数字时,它会起作用。嵌入式设备是64位,而我的本地主机是32位。

需要明确的是,在32位计算机上,该值为正;在64位计算机上,该值为负。

编辑:这是在带有SHELL的64位计算机的嵌入式设备上。左移23时不会发生。

echo $((192 << 23))
1610612736
echo $((192 << 24))
-1073741824
Run Code Online (Sandbox Code Playgroud)

在本地主机上,这是一台具有BASH32台计算机

echo $((192 << 55))
6917529027641081856
echo $((192 << 56))
-4611686018427387904
Run Code Online (Sandbox Code Playgroud)

lor*_*reb 2

POSIX(此处)表示“仅需要有符号长整数算术”,并且在 C 中,long 至少为 32 位;话虽这么说,一些 shell 明确选择固定宽度,例如 mksh 使用 32 位算术,并且查看 busybox 的源代码(math.h),似乎它们只使用 64 位 ENABLE_SH_MATH_SUPPORT_64 是#define'd,无论是否底层系统是32/64位。如果有人更了解的话,请说出来!