在 Excel 中处理 10 位以外的有符号数

Working with signed numbers other than 10-bit in Excel

我在 Excel 中是否缺少某种方法来设置二进制数的真实位数,或者我们是否坚持使用 10 位 DEC2BIN 和 BIN2DEC? 10 位是一个奇怪的选择。

理想情况下,我希望能够在真正带符号的 8 位世界或真正带符号的 16 位世界之间进行选择,并能够对这些数字执行操作。就目前而言,我无法将 11111111 设置为 -1 而不是 255。还有其他人处理过这个问题吗?

提前致谢。

带符号位+七个数据位在A1

=IF(LEFT(A1,1)="1",BIN2DEC(MID(A1,2,9999))-128,BIN2DEC(MID(A1,2,9999)))

例如:

Excel 对二进制、八进制和十六进制数施加 10 个字符的限制。对于二进制,这与 10 位限制一致。这个限制没有什么意义,我认为这是一个任意的决定,每个 Excel 版本都保留以保持向后兼容性。

对于 8 位二进制补码:

=LEFT(A1)*-128 + BIN2DEC(MID(A1,2,7))

对于 16 位二进制,将二进制数的每一半转换为十六进制并连接。您可以将该结果提供给 HEX2DEC。然后,您可以像处理 8 位一样处理二进制补码:

=LEFT(A1)*-32768 + HEX2DEC(BIN2HEX(MID(A1,2,7),2) & BIN2HEX(MID(A1,9,8),2))

DEC2BIN 和 BIN2DEC 使用 10 位有符号数,即 -512 到 511。

但是,由DEC2BINreturn编码的二进制表示是一个字符串。

DEC2BIN(7) returns "111", not 111.

如果您尝试对生成的二进制数进行数学运算,它会像在数字上下文中使用的任何字符串一样被处理:它使用 base-10 从字符串转换为数字。

DEC2BIN(7+1) returns "1000", 但 DEC2BIN(7)+1 returns 112. (即."111" + 1)

BIN2DEC(99+12) returns 7.(内部分为三步:99+12 -> 111 -> "111" -> 7.)

根据您的需要,我建议避免使用 DEC2BIN 和 BIN2DEC,并使用您自己的 VBA 函数进行转换,例如:http://www.vb-helper.com/howto_decimal_to_binary.html

您可以使用附加参数来增强这些函数,以指定 signed/unsigned 和 8/16/32 位,以及 return NaN 或二进制溢出错误。

VBA "Long" 数据类型是 64 位有符号整数(大约 18 位十进制数字),但您将无法利用 to/from Excel,处理 15 位数字而不损失精度。

VBA "Long" 使用 32 位无符号不会有问题。

>>>编辑更正:VBA长是32-位 有符号整数。

VBA Double 有一个 52 位尾数,所以至少可以用于 48 位有符号整数不损失精度的算法。

只重复第一位:

32 位到 40 位

HEX2DEC(
   IF(LEFT(HEX2BIN([@DH6]),1)="1","FF","") 
   &[@DH6]
   &[@DH5]
   &[@DH4]
   &[@DH3]
)

这个公式不成立。

尝试使用 10000000 的公式。 'Real' 的答案是 384,但公式的答案是 768,即 100000000。 我不知道那个特定的公式有什么问题?

我找到了一个有效的公式:

=SUMPRODUCT(--MID(Z24,LEN(Z24)+1-ROW(INDIRECT("1:"&LEN(Z24))),1),(2^(ROW(INDIRECT("1:"&LEN(Z24)))-1)))