> 백엔드 개발 > PHP 튜토리얼 > PHP 32비트 시스템의 긴 정수 강제 변환 오버플로에 대한 자세한 소개

PHP 32비트 시스템의 긴 정수 강제 변환 오버플로에 대한 자세한 소개

黄舟
풀어 주다: 2023-03-14 09:40:02
원래의
2573명이 탐색했습니다.

CleverCode에서는 최근 PHP 프로젝트 플라스틱 변환 문제가 발생했습니다. mysql id = 5147486396과 같이 bigint이고 긴 정수를 포함하는 필드 ID가 있습니다. 그러나 php 코드는 역사적인 이유로 여러 시스템에 배포되며, 그 중 시스템 A는 32비트 시스템이고 시스템 B는 64비트 시스템입니다. 이제 문제는 64비트 시스템에서 페이지 액세스가 정상이라는 것입니다. 32비트 시스템에서 액세스 오류가 발생했습니다. 그 이유는 PHP 형성 오버플로 때문입니다.

1 기계 데모

1.1 A 기계의 시스템 비트 번호 가져오기

#getconf LONG_BIT


1.2 변환 코드 변환

<?php

$id = 5147486396;
echo &#39;$id:&#39;.$id."\r\n";

$value = (int)$id;
echo &#39;(int)$id:&#39;.$value."\r\n";

$value = intval($id);
echo &#39;intval($id):&#39;.$value."\r\n";

$value = filter_var($id, FILTER_VALIDATE_INT);
echo &#39;filter_var($id, FILTER_VALIDATE_INT):&#39;."\r\n";
var_dump($value);


?>
로그인 후 복사
로그인 후 복사

1.3 실행 결과

(int)5147486396的结果是852519100,intval(5147486396)的结果是852519100,filter_var(5147486396, FILTER_VALIDATE_INT)结果是false。
로그인 후 복사


2 B 머신 데모

2.1 B 머신 시스템의 비트 수 가져오기

#getconf LONG_BIT


2.2 정수 변환 코드

<?php

$id = 5147486396;
echo &#39;$id:&#39;.$id."\r\n";

$value = (int)$id;
echo &#39;(int)$id:&#39;.$value."\r\n";

$value = intval($id);
echo &#39;intval($id):&#39;.$value."\r\n";

$value = filter_var($id, FILTER_VALIDATE_INT);
echo &#39;filter_var($id, FILTER_VALIDATE_INT):&#39;."\r\n";
var_dump($value);


?>
로그인 후 복사
로그인 후 복사

2.3 실행 결과

(int)5147486396的结果是5147486396,intval(5147486396)的结果是5147486396,filter_var(5147486396, FILTER_VALIDATE_INT)结果是5147486396。
로그인 후 복사


3 결론

단어 정수의 길이 플랫폼에 따라 다르지만 일반적으로 최대값은 약 20억(부호화된 32비트)입니다. 64비트 플랫폼의 최대값은 일반적으로 약 9E18입니다. PHP는 서명되지 않은 정수를 지원하지 않습니다. 정수 값의 단어 길이는 상수 PHP_INT_SIZE로 표현할 수 있습니다. PHP 4.4.0 및 PHP 5.0.5부터 최대값은 PHP_INT_MAX 상수

로 표현할 수 있습니다.

위 내용은 PHP 32비트 시스템의 긴 정수 강제 변환 오버플로에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿