2011-08-22 8 views

답변

2

이것은 아마도 괜찮은 프로그래밍 계산기로 말할 수 있지만, 8 비트로 감싼다면, 이것이 결과입니다.

   [ hex,unsigned,signed] 
    10111011 [0xBB,  187, -69] 
+ 11010101 [0xD5,  213, -43] 
    -------- 
= (1)10010000 [0x90,  144, -112] 

다음과 같이 수동으로이 과정을 수행 할 수 있습니다

set carry to zero 
for each position starting at right side, progressing left: 
    set sum to carry 
    add bit from position in first number to sum 
    add bit from position in second number to sum 
    if sum is greater than one: 
     subtract two from sum 
     set carry to one 
    else 
     set carry to zero 
    end if 
    store sum to position of result 
end for 
+0

... 존재하는 경우 오버플로 비트가 설정됩니다. ;) – Lucero

+0

수동으로 오버플로 비트를 추가해야했습니다. 'end for' 후에'result [0] = carry'를 추가합니다. 내가 놓친 게 있니? –

+0

@James, 만약 당신이 8 비트 밖에 가지고 있지 않다면, 보통 0에서 7까지의 비트이므로 'carry'를'result [0]'에 넣는 것은 잘못된 것입니다. 그리고 비트가 1부터 8까지라면'result [0] '은 8 비트가 아닌 _nine_ 비트를 가짐을 의미합니다. 대개 무슨 일이 일어나는가는 결과가 랩되고 캐리의 최종 값이이를 나타낼 것입니다. – paxdiablo

0

2의 보수의 좋은 점은 당신이 서명 또는 부호없는 숫자 여부를 당신이 알 필요가 없다는 것입니다. 이진 표현을 취하고 오버플로 비트를 추가하고 삭제합니다. 당신이 표현할 수있는 숫자의 범위를 버린 경우, 잘, 힘든 행운. 그러나 2 개의 음수를 추가하고 긍정적 인 것을 얻는 것은 의혹을 제기해야한다.

실제 노트에

: 같은 질문 것들에 의해 C에서 오버 플로우를 방지하기 하지 시도를 수행

a = b+c; 
if (((b > 0) && (a < c)) || ((b < 0) && (a > c))) { 
    ... 
} 

이 아마 표준 디버그 빌드에서 작동 것이지만, C (및 C++) 컴파일러가 허용된다 이 수표를 멀리 낙찰하십시오. (부호가없는 산술에 대해서는 더 자주 보입니다. if (a >= (a+b)) { ... }gcc -Wall은 거짓임을 경고합니다. C 표준은 오버플로가 정의되지 않은 동작이라고 설명하므로 어쨌든 괜찮습니다.)

잘 모르겠 음 제한된 범위의 정수형을 가진 다른 언어에서 상황은 어떠합니까?

관련 문제