웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
$i++ !== $i += 1
2003.08.04 22:23
에... 제목이 비교문...
무슨뜻인가 하면
변수 $i를 $i++ 를해서 1증가시키는것과
$i += 1 해서 증가시키는것이 다르다는것입니다.
음...
보통때는 값이 같죠.
그러나 인트(정수)의 한계에 가면 달라집니다.
렐카운터만들다가 안사실이고 이렇게 해보면 어떻까해서 글을 쓰는...
일단 증명을 위해 간단한소스를...
<?
// $i++ !== $i += 1
// int : -2147483648 ~ 2147483647
$i = 2147483647;
$j = 2147483647;
if($i++ == $j += 1){
echo "$i : $i == $j : $j";
}else{
echo "$i : $i !== $j : $j";
}
?>
2147483647라는 수는 32비트정수의 양수의 끝이죠. (즉31비트)
덤으로 나머지 한비트는(맨앞의) 부호로써서 1이면 음수 0이면 양수입니다.
소스에 주석으로 적은것은 정수의 범위를 표현한것입니다.
일단 변수 $i와 $j를 같이 정수의 끝값으로 줍니다.
그다음 if문으로 저렇게 대입과 동시에 비교를 하게합니다.
값이 같다면 위의 결과가 다르다면 아래가 실행되겠죠.
결과는
$i : -2147483648 !== $j : 2147483648
로써 역시 다르게 나왔습니다.
자세히보면 변수 $j가 정수의 한계를 벗어났고
변수 $i는 정수의 최소값이 되었습니다.
무슨사태인가 하면...
대입문을 다르게하는것으로 상당히 다른 결과를 초래할수있다는것입니다.
php의 내부구조는 잘모르지만
++로 증가시키는것과 +1 로 증가시키는 것이 다른것같군요
그래서 ++를 쓰지않고 +1간이 쓰면 숫자를
99 9999 9999 9999까지 처리할수있죠(렐카운터는 변수를 두개써서 저수의 제곱만큼 카운터가 가능;;)
저이상을 쓰면 지수적표현으로 되서 완전히 문자열로...
C에서는 저둘이 같을지도 모르겠지만
php에서는 ++로 처리하는것만 루프를 돌게되는것같네요
--로 같은현상을 나타낼듯합니다.
이상 허접한 팁이었습니다(_ _)
무슨뜻인가 하면
변수 $i를 $i++ 를해서 1증가시키는것과
$i += 1 해서 증가시키는것이 다르다는것입니다.
음...
보통때는 값이 같죠.
그러나 인트(정수)의 한계에 가면 달라집니다.
렐카운터만들다가 안사실이고 이렇게 해보면 어떻까해서 글을 쓰는...
일단 증명을 위해 간단한소스를...
<?
// $i++ !== $i += 1
// int : -2147483648 ~ 2147483647
$i = 2147483647;
$j = 2147483647;
if($i++ == $j += 1){
echo "$i : $i == $j : $j";
}else{
echo "$i : $i !== $j : $j";
}
?>
2147483647라는 수는 32비트정수의 양수의 끝이죠. (즉31비트)
덤으로 나머지 한비트는(맨앞의) 부호로써서 1이면 음수 0이면 양수입니다.
소스에 주석으로 적은것은 정수의 범위를 표현한것입니다.
일단 변수 $i와 $j를 같이 정수의 끝값으로 줍니다.
그다음 if문으로 저렇게 대입과 동시에 비교를 하게합니다.
값이 같다면 위의 결과가 다르다면 아래가 실행되겠죠.
결과는
$i : -2147483648 !== $j : 2147483648
로써 역시 다르게 나왔습니다.
자세히보면 변수 $j가 정수의 한계를 벗어났고
변수 $i는 정수의 최소값이 되었습니다.
무슨사태인가 하면...
대입문을 다르게하는것으로 상당히 다른 결과를 초래할수있다는것입니다.
php의 내부구조는 잘모르지만
++로 증가시키는것과 +1 로 증가시키는 것이 다른것같군요
그래서 ++를 쓰지않고 +1간이 쓰면 숫자를
99 9999 9999 9999까지 처리할수있죠(렐카운터는 변수를 두개써서 저수의 제곱만큼 카운터가 가능;;)
저이상을 쓰면 지수적표현으로 되서 완전히 문자열로...
C에서는 저둘이 같을지도 모르겠지만
php에서는 ++로 처리하는것만 루프를 돌게되는것같네요
--로 같은현상을 나타낼듯합니다.
이상 허접한 팁이었습니다(_ _)
댓글 14
-
TheMics
2003.08.04 22:47
-
chadr
2003.08.04 22:58
$i = 2147483647;
$j = 2147483647;
if($i++ == $j += 1){
echo "$i : $i == $j : $j";
}else{
echo "$i : $i !== $j : $j";
우선 현재 위의 코드에서 논리상으로는 i++와 j+=1은 같은 뜻입니다.
또한 php에서도 내부적으로 같은 형식으로 표현이 됩니다.
하지만 i++또는 ++i는 값을 증가시킬때 변수의 값을 시피유의 레지스터로 가져와서
값을 증가시킨후 그 결과를 i에 넣는 형식으로 보입니다.
하지만 j+=1은
j라는 int형 변수와 1이라는 int형 상수를 각각 레지스터로 가져와서 둘을 더해서 j의 변수에
대입하는 형식이라 보입니다.
그러면 여기서 둘의 차이점은 무엇이냐..
첫번째로 i++는 레지스터 내부에서 1을 증가시킵니다. 즉 1이라는 값은 int형의 값이 아니고
레지스터 내부에서 증가되는 일련의 32비트 값이지요.
따라서 레지스터에서 증가시킨 결과는 오버플로우가 발생하여 -2147483648 이라는 값이 됩니다.
반대로 두번째는..
i라는 변수의 값 2147483647하고 int형 상수값 1을 레지스터로 각각 가져와 연산후 j라는 변수에
넣게됩니다. 이때 자동 형변환이 일어나 j라는 변수가 int형이 아닌 double형이 되어버립니다.
(php에서는 변수타입이 유동적으로 변하지요?)
따라서 두번째 j의 값은 -2147483648 이 아니라 2147483647이 되게되는것이죠.
위의 프로그램에서
$i = 2147483647;
$j = 2147483647;
이 부분을
$i = 2147483647.0;
$j = 2147483647.0;
으로 고쳐서 i와 j를 double형으로 만들어서 돌려보시면 아실것입니다.
하지만 c언어나 c++과 같은 언어에서는 절대 저런일이 발생하지 않습니다.
이런 언어들은 한번 선언된 변수는 사라질때까지 선언된 변수의 형을 유지하기 때문이죠. -
chadr
2003.08.04 23:11
아참.
if($i++ == $j += 1){
echo "$i : $i == $j : $j";
}else{
echo "$i : $i !== $j : $j";
위의 소스에서 $i++를 ++$i라고 해야지
$i : 2147483648 == $j : 2147483648라는 결과가 나옵니다
i++과 ++i의 차이점은 아시죠? :)
그리고
따라서 두번째 j의 값은 -2147483648 이 아니라 2147483647이 되게되는것이죠.
이것을
따라서 두번째 j의 값은 -2147483648 이 아니라 2147483648이 되게되는것이죠. 로=_=
왜이리 오타가..=_= -
플로렐라
2003.08.04 23:22
더블은 유효자리수가 15자리군요.
처음소스는
if($i++ !== $j += 1){
echo "$i : $i !== $j : $j";
}else{
echo "$i : $i == $j : $j";
}
여서... 바꾸면서 고려를 안한게있군요...;;;
설명감사합니다^-^
프로그래밍할때 php의 유동적인 면이 상당히 편리하다는^^;; -
TheMics
2003.08.05 13:00
에;이진수의 연산법으로 저런 현상을 설명해 드리면(위에 설명된 PHP의 정수형은 32비트이지만 여기서는 8비트로 설명드리겠습니다;;)
01111111 <- 127입니다. 맨 앞의 0은 양수를 나태냅니다.
+ 00000001 <- 1을 더하면
-----------
10000000 <- 최소값인 -128이 나와버립니다...맨 앞의 1은 음수를 나타내구요;
반대로 -128에서 1을 빼는 경우는 어떨까요.
10000000
- 00000001
-----------
01111111 <- 역시 최대 한계치인 127이 등장합니다;
/*
물론 컴퓨터에서는 뺄셈시에는 2의보수를 사용해
10000000
+ 11111111
-----------
101111111 <- 맨앞의 1은 오버플로우로 버려 01111111이 나오겠죠;
로 계산하지만요;
*/
최대값 혹은 최소값에서 각각 1을 빼거나 더하면 정 반대의 값이 나온다는 이야기죠.
물론, 일반적인 프로그래밍과는 무관하다고 할 수 있습니다; 그냥 이해를 돕기 위해 공학 범위의 내용을 말해 보았습니다; -
플로렐라
2003.08.05 14:09
두분의 설명들^-^;;
저도 대충 알고있던 면이기도 하고...
제가 이글을 쓴이유는 이런 php의 특징을
잘활용해 보자는 의미에서;;; -
세상
2003.08.05 21:08
와우~ 흥미롭게 잘 읽었습니다~
++이 레지스터 자체 연산인지는 처음 알았네요~ ㅇ_ㅇ -
플로렐라
2003.08.06 17:09
처음에는 if($i++ == $j += 1) 이렇게 직접 비교할생각이 아니라
따로한다음 변수들끼리 대입할생각있었는데 제목을 저렇게 쓰니까 해보고싶은 마음이;
하니까 되긴 되기에;; 저렇게 소스를 쓴;;; -
이범진
2003.08.08 15:03
다 좋긴한데... PHP에서의 그 유동성 덕분에...
한순간에 머리 깨지는 일도 생기기도 하죠...
그럴때는 차라리 C로 돌아가서 딱짤라버리는게 확실한데..;; -
플로렐라
2003.08.17 09:57
C는 상수도 형태가 있어서
a/3 과 a/3. 이 다르다는... -
Root
2003.08.27 18:37
i++
i+=1
i=i+1
모두 같은 겁니다. -_- -
플로렐라
2003.08.28 17:17
의미야 같죠 -_-;
리플단사람중에 모르는사람없죠.
그러나 저런 현상이 일어난다는것은
알아두는 편이 좋으니... -
chadr
2003.09.11 23:04
Root// 죄송하지만 i+=1와 i=i+1은 같은 방식으로 계산되지만 i++또는++i는 계산하는 방식이 다릅니다. 그리고 둘의 의미도 다르죠. 아무래도 프로그래밍을 다시 배우셔야할듯;; -
Root
2003.09.14 22:17
chadr // 아뇨.. 저는 아직 프로그래밍을 다시 배울 필요는 없다고 봅니다.
저는 원래 VB밖에 할줄 모릅니다... 저것도 원래 PHP가 아니라 액션스크립트 책에 나온걸 똑같이 설명한거구요.
설령 PHP을 제대로 안다고 생각하고 PHP차원에서 예기를 했더라도 저 부분만 다시 배우면 되겠죠...
뭣하러 당신같이 시간낭비를 하겠습니까? ^^ 그렇겠죠?
그리고 "아무래도 프로그래밍을 다시 배우셔야할듯;;"은 "플래시5 액션 스크립트 인터랙티브 무비 만들기" 라는 책의 저자에게 하세요.
저는 그의 말을 옮겨적었을뿐 제가 한소리는 아닙니다.
제목 | 글쓴이 | 날짜 |
---|---|---|
동적으로 Extensions(library) 로딩하기 | impre | 2003.09.20 |
include 할시에 주의사항..(경로설정관련) [10] | 피너츠 | 2003.09.14 |
지정한만큼 암호화/해독 하기 [24] | 뒹굴리스트 | 2003.09.10 |
모든파일을 리스트로 만들기; [10] | 플로렐라 | 2003.09.10 |
군대간 친구 남은날짜 구하기 2(복무기간 단축에 따른 수정) [8] | 신민경 | 2003.09.02 |
자료실에 쓸만한 자료용량 환산 [7] | 한승진 | 2003.09.01 |
php 랜덤 이미지 디렉토리 검색으로 편하게.. [3] | 꺼노 | 2003.08.28 |
웹디자이너와 프로그래머가 사이 좋게 코딩하는 방법 [50] | 마이템플릿 | 2003.08.13 |
개판 오분전 정규식(1) | 미친개 | 2003.08.07 |
개판 오분전 정규식(2) [5] | 미친개 | 2003.08.07 |
개판 오분전 정규식(3) [2] | 미친개 | 2003.08.07 |
개판 오분전 정규식(4) | 미친개 | 2003.08.07 |
$i++ !== $i += 1 [14] | 플로렐라 | 2003.08.04 |
체널을 응용해서 tmain.php?tdb=test&db=src 식으로 쓰기 [12] | 9000㎒ | 2003.08.01 |
제로보드 + MSN 메신저 (작성글에 리플이나 코멘트가 달리면 MSN으로 알려준다?) [18] | HungryMania | 2003.08.01 |
스킨 시스템 사용하기 [2] | 김규백 | 2003.07.25 |
다른 사이트에 있는 파일 읽어오기 [50] | 김규백 | 2003.07.25 |
초간단 php 랜덤 이미지 및 랜덤 배경이미지 소스 [6] | 거금도 | 2003.07.24 |
'와 "의 속도 차이?! [6] | holies | 2003.07.12 |
Thumbnail 생성하기 - 수정^^; [9] | holies | 2003.07.11 |
내일 자세히 알아와서 보충해 드리겠습니다:)