2009-12-29 3 views
10

MIPS에서 부호없는 정수로 작업 할 때, 수행하는 모든 연산이 부호가없는 경우에도 부호가없는 하나인데도 모든 연산 결과에 부호가 남습니다 (즉, 정수는 모두 2의 보수입니다) : 네 번째 ...부호없는 숫자에 대한 MIPS 연산이 부호있는 결과를 얻는 이유는 무엇입니까?

[2^31, 2^32 - 1] 범위의 숫자를 인쇄 할 때 'overflowed'음수 값이 서명 된 것처럼 보입니다. 나는 이런 식으로 뭔가를하려고 할 때

비록, :

li $v0, 1 
li $a0, 2147483648    # or any bigger number 
syscall 

인쇄 된 숫자는 내가 무엇을 놓치고 ... 항상 내가 혼란 스러워요 2147483647 (2^31 - 1)

입니까?

추신 : 어셈블리 코드와 같이 매우 읽기 어려운 코드를 포함하지 않았으므로이 문제를 제쳐 놓고 이 정상적으로 작동하는 것 같습니다. 누군가가 필요하다고 느끼면 즉시 포함시켜야합니다! Wikipedia에서

답변

14

: 추가의 일환으로 서명되지 않은 단어와 지침을 빼기 것을

MIPS32 명령어 세트 상태는 잘못된 것입니다. 명령의 부호있는 버전과 부호없는 버전 간의 차이점은 피연산자의 부호 확장 (또는 부호 부족)이 아니지만 오버플로 (예 : 추가)에서 트랩이 실행되는지 또는 오버플로가 무시되는지 (부호없는 추가)을 제어합니다. 이 명령어에 대한 즉치 연산자 인 CONST는 항상 부호 확장됩니다. MIPS Instruction Reference 가입일

:

ALL 산술 즉시 값은 부호 확장되어 [...] 부호와 부호 지시 유일한 차이점은 서명 지시 오버 플로우 예외를 생성 할 수 있으며, 부호 지시 수 있다는 아니.

+0

나는 인터넷을 통해 대답을 찾고 있었다. 감사! – dankilman

+0

그런데 왜 "checked and unchecked"대신에 "signed and unsigned"라는 용어를 사용합니까? – dan04

+0

이름이 잘못되었습니다. 첫 번째 견적을 읽으십시오. –

1

숫자를 인쇄 할 때 실제 문제가 발생하는 것처럼 보입니다. 그것은 항상 당신이 서명 한대로 전달하고, 가능하면 잘 묶여있는 것으로 해석합니다.

관련 문제