2017-11-09 10 views
1

16 진수 표현을 기반으로 정수 매개 변수를 선언하고 싶습니다. 의 차이점은 무엇입니까 : (. 그리고 그래, 나는이 그냥 -1 것을 알고)16 진수 상수

INTEGER(kind=int32), PARAMETER :: a = Z'FFFFFFFF' 
INTEGER(kind=int32), PARAMETER :: b = int(Z'FFFFFFFF', kind=int32) 
INTEGER(kind=int32), PARAMETER :: c = transfer(Z'FFFFFFFF', 1_int32) 

gfortran 나에게 유용하게 나는 것을 무시할 수 있다고 말해 (컴파일시 정수 오버플로 오류를 줄 것으로 보인다 -fno-range-check으로) 위의 코드는 a이고 b이지만 c는 그렇지 않습니다.

이 코드는 다른 컴파일러로 컴파일 될 수 있으므로 Fortran 2003을 준수해야합니다.

+0

IIRC Fortran 2003과 2008 사이에 규칙이 일부 변경되었습니다. 엄격하게 2003이 필요합니까? –

+0

소프트웨어 상태 Fortran 2003의 코드 표준 – chw21

답변

2

첫 번째 문과 세 번째 문은 유효한 포트란이 아닙니다. boz 리터럴 상수는 많은 제한된 컨텍스트에서만 나타날 수 있습니다. int intrinsic은 이러한 컨텍스트 중 하나입니다.

중간 명령문은 boz-literal-constant에 지정된 비트 시퀀스를 기반으로 프로세서 종속 값으로 명명 된 상수 값을 설정합니다. 결과 값의 최상위 비트가 1이기 때문에 값은 프로세서에 따라 다릅니다. 포트란 2,008 규칙을 사용

정교화 (블라디미르 노트로 포트란 2003 달랐다)

  • 보즈 리터럴 상수 (32) 하나의 시퀀스를 지정 비트 (또는 ON/.TRUE를/어떤.).
  • INTEGER (INT32)는 32 비트의 STORAGE_SIZE를 가진 정수를 지정합니다.이 유형은 해당 유형의 객체의 BIT_SIZE보다 크거나 같을 것입니다 (저장 비트 및 "값 비트"는 정렬 요구 사항).
  • INT 내장 함수는 필요한 경우 비트 시퀀스를 관련 비트 크기로 자릅니다. 그 절단 된 서열의 최 좌측 비트가 제로라면
    • 가 상기 INT의 고유의 값이 가장 오른쪽 비트 B의 존재로, B는 비트 시퀀스를 나타내는 배열 SUM([b(i) * (i-1)**2, i = 1, SIZE(b)])과 같이 주어진다 (1) .
    • 예 에서처럼 잘린 시퀀스의 가장 오른쪽 비트가 1이면 표준에 따르면 프로세서에 따라 다릅니다. 이는 부호를 표현하기 위해 값의 내부 표현에서 최상위 비트를 사용하는 전형적인 관행을 수용하기위한 것입니다. 매우 보편적 인 정수의 2의 보수 표현을 사용하면 -1 값을 얻을 수 있습니다.

포트란에서 2,003 비트의 시퀀스는 상기 프로세서에 대한 가능한 가장 큰 정수 표현을 사용하여 정수로 해석된다. 결과 값은 INTEGER (INT32) 오브젝트 범위를 벗어나 코드를 부적합하게 만듭니다.

+0

"결과 값의 최상위 비트가 1이기 때문에 값은 프로세서에 따라 다릅니다." 죄송합니다, 그 문장을 이해하지 못합니다. 예를 들어 설명해 주시겠습니까? – chw21

+0

이것도 이해하려고 노력합니다. 해석은 네이티브 아키텍처와 상관없이 빅 엔디안 인 것처럼 보입니다. 하지만 음수 인코딩이 프로세서에 종속적 일 수 있다고 말하는 것입니까? 내가 만났던 다양한 문서는 모두 가정 된 인코딩에 대해 침묵합니다. – agentp

+0

따라서 프로세서가 부호있는 정수를 저장하는 방법에 따라 프로세서 의존성이 있습니다. 오늘 부호있는 정수를 2의 보수로 저장하지 않는 프로세서가 있습니까? – chw21