Прямое приведение (int)$str
и (float)$str
на самом деле совсем не работает по-разному: они оба читают столько символов из строки, сколько могут интерпретировать как число соответствующего типа.
Для«0x4B0», int-преобразование читает «0» (ОК), затем «x» и останавливается, потому что не может преобразовать «x» в целое число.Аналогично для преобразования с плавающей запятой.
Для «1.2e3» int-преобразование читает «1» (ОК), затем «.»и останавливается.Преобразование с плавающей точкой распознает всю строку как правильную запись с плавающей точкой.
Автоматическое распознавание типа для выражения типа $str * 1
просто более гибкое, чем явное приведение.Для явного приведения требуется, чтобы целые числа и числа с плавающей точкой были в формате, создаваемом %i
и %f
в printf
, по существу.
Возможно, вы можете использовать intval и floatval , а не явное приведение к int для большей гибкости.
Наконец, ваш вопрос "шестнадцатеричные данные должны быть действительными или недействительными числовыми данными?"неловкоНет такой вещи как "шестнадцатеричные данные".Шестнадцатеричный - это просто числовая база. Что вы можете сделать, это взять строку типа "4B0" и использовать strtoul
и т. Д., Чтобы проанализировать ее как целое число в любой базе чисел от 2 до 36. [Извините, это был Б.С.Там нет strtoul
в PHP.Но intval
имеет эквивалентную функциональность, см. Выше.]