<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 這部分代碼與文章內容無關,僅作為前置代碼示例</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"開始執行 PHP 腳本...\n"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-meta"><?php</span></span><span>
<span class="hljs-comment">/*
* base_convert() 函數中處理負數進制轉換時,有哪些注意事項?
*
* base_convert() 是 PHP 內置的一個函數,用於在不同的進制之間轉換數字字符串。
* 它的函數簽名是:string base_convert(string $number, int $from_base, int $to_base)
*
* 但在實際使用中,base_convert() 並不支持直接處理負數。
* 下面將詳細說明關於負數和進制轉換時需要注意的幾個關鍵點。
*/</span>
</span><span><span class="hljs-comment">// 1. base_convert() 不支持負數輸入</span></span><span>
</span><span><span class="hljs-comment">// base_convert() 接收的 $number 參數是字符串形式的數字,且該數字只能是非負整數。</span></span><span>
</span><span><span class="hljs-comment">// 如果傳入帶負號的字符串(如 "-15"),函數會將負號當成非法字符忽略,導致結果不正確。</span></span><span>
</span><span><span class="hljs-comment">// 示例</span></span><span>
</span><span><span class="hljs-variable">$negativeNumber</span></span><span> = </span><span><span class="hljs-string">"-15"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">base_convert</span></span><span>(</span><span><span class="hljs-variable">$negativeNumber</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"轉換結果(輸入帶負號): <span class="hljs-subst">$result</span></span></span><span>\n";
</span><span><span class="hljs-comment">// 輸出結果會忽略負號,等同於轉換“15”,並不是期望的負數二進製表示。</span></span><span>
</span><span><span class="hljs-comment">// 2. 處理負數的常用方法</span></span><span>
</span><span><span class="hljs-comment">// 由於 base_convert() 不支持負數轉換,通常的做法是先檢測數字的正負號,</span></span><span>
</span><span><span class="hljs-comment">// 然後對絕對值進行進制轉換,最後再手動添加負號。</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">base_convert_negative</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$number</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$from_base</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$to_base</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
</span><span><span class="hljs-variable">$isNegative</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$number</span></span><span>) > </span><span><span class="hljs-number">0</span></span><span> && </span><span><span class="hljs-variable">$number</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>] === </span><span><span class="hljs-string">'-'</span></span><span>) {
</span><span><span class="hljs-variable">$isNegative</span></span><span> = </span><span><span class="hljs-literal">true</span></span><span>;
</span><span><span class="hljs-variable">$number</span></span><span> = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$number</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>);
}
</span><span><span class="hljs-variable">$converted</span></span><span> = </span><span><span class="hljs-title function_ invoke__">base_convert</span></span><span>(</span><span><span class="hljs-variable">$number</span></span><span>, </span><span><span class="hljs-variable">$from_base</span></span><span>, </span><span><span class="hljs-variable">$to_base</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$isNegative</span></span><span> ? </span><span><span class="hljs-string">'-'</span></span><span> . </span><span><span class="hljs-variable">$converted</span></span><span> : </span><span><span class="hljs-variable">$converted</span></span><span>;
}
</span><span><span class="hljs-comment">// 測試</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">base_convert_negative</span></span><span>(</span><span><span class="hljs-string">"-15"</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>; </span><span><span class="hljs-comment">// 輸出:-1111</span></span><span>
</span><span><span class="hljs-comment">// 3. 進制轉換的範圍限制</span></span><span>
</span><span><span class="hljs-comment">// base_convert() 支持的進制範圍是 2 到 36。</span></span><span>
</span><span><span class="hljs-comment">// 如果試圖轉換超出這個範圍的進制,函數會返回空字符串。</span></span><span>
</span><span><span class="hljs-comment">// 所以在處理負數時,也需要保證傳入的進制合法。</span></span><span>
</span><span><span class="hljs-comment">// 4. 負數的進製表現形式</span></span><span>
</span><span><span class="hljs-comment">// 在某些場景中,可能希望用補碼形式表示負數的二進制。</span></span><span>
</span><span><span class="hljs-comment">// 但 base_convert() 只是簡單轉換數值,不支持補碼或有符號數的轉換。</span></span><span>
</span><span><span class="hljs-comment">// 如果需要補碼表示,必須自行處理位運算和格式化。</span></span><span>
</span><span><span class="hljs-comment">// 5. 總結</span></span><span>
</span><span><span class="hljs-comment">// - base_convert() 不支持直接轉換帶負號的數字。</span></span><span>
</span><span><span class="hljs-comment">// - 需要手動分離負號,轉換絕對值,再加回負號。</span></span><span>
</span><span><span class="hljs-comment">// - 進制必須在 2 到 36 之間。</span></span><span>
</span><span><span class="hljs-comment">// - 補碼或其他負數二進製表示需自行實現。</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>