负数在16进制中通常表示为2的补码形式。下面是一个简单的函数示例,它处理正数和负数的16进制到10进制的转换:
function hexToDecimal($hexString) {
// 移除可能的0x前缀
$hexString = ltrim($hexString, '0x');
// 转换为无符号的10进制数
$unsignedDecimal = hexdec($hexString);
// 检查是否表示负数(最高位为1)
if (($unsignedDecimal & 0x80000000) !== 0) {
// 如果是负数,转换为补码形式
$signedDecimal = -((~$unsignedDecimal + 1) & 0xFFFFFFFF);
} else {
// 如果是正数,直接使用无符号的10进制数
$signedDecimal = $unsignedDecimal;
}
return $signedDecimal;
}
// 示例使用
$positiveHex = '1A'; // 正数示例
$negativeHex = 'FFFFFEE1'; // 负数示例
echo "Positive Decimal: " . hexToDecimal($positiveHex) . "\n";
echo "Negative Decimal: " . hexToDecimal($negativeHex) . "\n";
在上面的代码中,我们首先去掉了可能的0x前缀,然后使用hexdec函数将16进制字符串转换为无符号的10进制数。接着,我们检查最高位(符号位)来确定数字是正数还是负数。如果最高位是1,我们将其视为负数,并使用补码转换公式将其转换为正确的负数10进制表示。如果最高位是0,我们直接返回无符号的10进制数,因为它是一个正数。
请注意,上面的函数假设输入的16进制字符串表示的是32位整数。如果你处理的是不同位数的整数,你需要调整掩码值(0xFFFFFFFF)以匹配你的位数。例如,对于16位整数,你应该使用0xFFFF作为掩码。