我發現了一些奇怪的東西。 不同版本的Perl的不同行爲。Perl 5.6.1與Perl 5.14 - 將十進制轉換爲十六進制
的代碼是:
$x = -806;
$x = sprintf "0x%x" , $x;
print "$x";
在5.6.1,我得到: 0xfffffcda
在5.14獲得: 0xfffffffffffffcda
我如何獲得32位在5.14,以及?
謝謝!
我發現了一些奇怪的東西。 不同版本的Perl的不同行爲。Perl 5.6.1與Perl 5.14 - 將十進制轉換爲十六進制
的代碼是:
$x = -806;
$x = sprintf "0x%x" , $x;
print "$x";
在5.6.1,我得到: 0xfffffcda
在5.14獲得: 0xfffffffffffffcda
我如何獲得32位在5.14,以及?
謝謝!
負數的事情是他們通過二進制補碼來表示。你看到的是字大小的結果。
我不完全確定它爲什麼會發生變化(除了14年和一般遷移到64位),但要重新編譯perl並不容易。我建議這不是一個好主意,因爲你真正想要得到的是一個串化。
一種更簡單的解決方案將是一個按位與具有適當長度的位掩碼:
$x = -806;
$x = sprintf ("0x%x" , $x & 0xffffffff);
print "$x";
簡單和天才!謝謝! –
一些除了上面的答案:
數字Perl的產生的數量時,其sprintf
轉換爲十六進制取決於本機C數據類型Perl的大小在內部用於存儲無符號整數值。 Perl的Configure
腳本在設置編譯Perl解釋器時決定了哪種類型,因此它不是在運行時可以更改的東西。它也可能因操作系統和機器而異,所以如果您在不同的環境中運行腳本,則無法確定將生成多少十六進制數字(強烈贊成Sobrique的建議)。自5.6.1發佈以來的14年間,默認本機類型很可能會從32位版本更改爲64位版本。
如果您想知道在特定的perl安裝中使用哪種類型,perl -MConfig -E 'say $Config{uvtype}'
會告訴您(根據需要修改5.10版之前的版本)。
請注意,它與Perl版本無關。你可以有一個64位版本的Perl 5.6和一個32位版本的5.14。 – ikegami