Разница между передачей строки "0x30" и шестнадцатеричного числа 0x30 в функцию hex () - PullRequest
5 голосов
/ 24 декабря 2010

print hex("0x30"); дает правильное преобразование из шестнадцатеричного числа в десятичное.Значение, которое он дает, составляет 72.

Ответы [ 3 ]

13 голосов
/ 24 декабря 2010

hex() принимает строковый аргумент, поэтому из-за слабой типизации Perl он будет читать аргумент как строку независимо от того, что вы передаете ему.

Первый из них передает 0x30 как строку, что hex() затем напрямую преобразуется в десятичное число.

Последнее представляет собой шестнадцатеричное число 0x30, равное 48 в десятичном виде, передается в hex(), которое затем снова интерпретируется как шестнадцатеричное и преобразуется в десятичное число 72это как hex(hex("0x30")).

Вы должны придерживаться hex("0x30").

$ perl -e 'print 0x30';
48
$ perl -e 'print hex(0x30)';
72
$ perl -e 'print hex(30)';
48
$ perl -e 'print hex("0x30")';
48
$ perl -e 'print hex(hex(30))';
72
3 голосов
/ 24 декабря 2010

Чтобы расширить ответ Marcog: С perldoc -f hex

hex EXPR: интерпретирует EXPR как шестнадцатеричную строку и возвращает соответствующее значение.

Так что hex действительно для преобразования между строковым и шестнадцатеричным значением. Набрав 0x30, вы уже создали шестнадцатеричное значение.

perl -E '
  say 0x30;
  say hex("0x30");
  say 0x48;
  say hex(0x30);
  say hex(hex("0x30"));'

дает

48
48
72
72
72
2 голосов
/ 24 декабря 2010

hex() анализирует шестнадцатеричную строку и возвращает соответствующее целое число.

Таким образом, когда вы делаете hex(0x30) ваш числовой литерал (0x30) интерпретируется как таковой (0x30 - это 48 в шестнадцатеричном формате), тогда hex () обрабатывает это скалярное значение как строку ("48") и преобразует его в число, предполагая, что строка в шестнадцатеричном формате. 0x48 == 72, откуда 72.

...