2015-09-07 166 views
1

我發現了一些奇怪的東西。 不同版本的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,以及?

謝謝!

+0

請注意,它與Perl版本無關。你可以有一個64位版本的Perl 5.6和一個32位版本的5.14。 – ikegami

回答

5

負數的事情是他們通過二進制補碼來表示。你看到的是字大小的結果。

我不完全確定它爲什麼會發生變化(除了14年和一般遷移到64位),但要重新編譯perl並不容易。我建議這不是一個好主意,因爲你真正想要得到的是一個串化。

一種更簡單的解決方案將是一個按位與具有適當長度的位掩碼:

$x = -806; 
$x = sprintf ("0x%x" , $x & 0xffffffff); 
print "$x"; 
+0

簡單和天才!謝謝! –

2

一些除了上面的答案:

數字Perl的產生的數量時,其sprintf轉換爲十六進制取決於本機C數據類型Perl的大小在內部用於存儲無符號整數值。 Perl的Configure腳本在設置編譯Perl解釋器時決定了哪種類型,因此它不是在運行時可以更改的東西。它也可能因操作系統和機器而異,所以如果您在不同的環境中運行腳本,則無法確定將生成多少十六進制數字(強烈贊成Sobrique的建議)。自5.6.1發佈以來的14年間,默認本機類型很可能會從32位版本更改爲64位版本。

如果您想知道在特定的perl安裝中使用哪種類型,perl -MConfig -E 'say $Config{uvtype}'會告訴您(根據需要修改5.10版之前的版本)。

相關問題