2015-01-24 4 views

답변

1

에 있다고 말한다하도록 할 수 있습니다. 차이점은 주어진 언어/컴파일러/환경/프로세서가 주어진 2 진수 시퀀스를 어떻게 처리하는지에 있습니다. 예를 들어 Intel x86/x64 환경에서는 MULIMUL 곱셈에 대한 지침이 있습니다. IMUL 명령어는 부호가있는 곱셈을 수행합니다 (즉, 피연산자 비트를 부호있는 값으로 처리합니다). 부호있는/부호없는 피연산자를 구별하는 다른 지침 (예 : DIV/IDIV, MOVSX 등)도 있습니다.

#include <stdio.h> 
#include <stdint.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int16_t c16; 
    uint16_t u16; 

    __asm { 
     mov al, 0x01 
     mov bl, 0x8F 
     mul bl   // ax = 0x01 * 0x8F 
     mov u16, ax 

     mov al, 0x01 
     mov bl, 0x8F 
     imul bl   // ax = 0x01 * 0x8F 
     mov c16, ax 
    }; 

    char uBits[65]; 
    char cBits[65]; 

    printf("%u:\t%s\n", u16, _itoa(u16, uBits, 2)); 
    printf("%d:\t%s\n", c16, _itoa(c16, cBits, 2)); 

    return 0; 
} 

출력은 다음과 같습니다 : 여기

빠른 예제

편집에
143: 10001111 
-113: 11111111111111111111111110001111 

:
그냥 예제를 확장 - C/C++에서 (구별 다른 언어와 마찬가지로 부호있는 및 부호없는 수량) 컴파일러는 부호있는 값 또는 부호없는 값에서 연산을 수행하는지 알며 적절한 명령어를 생성합니다. 위의 예에서 컴파일러는 int (C/C++에서는 int이 기본적으로 서명 됨 - signed int을 나타내는 것과 동일 함)으로 승격하므로 _itoa()을 호출 할 때 변수 c16을 올바르게 부호 확장해야 함을 알고 있습니다. 변수 은 _itoa()을 호출 할 때 unsigned int으로 승격되므로 부호 확장이 발생하지 않습니다 (부호없는 값에 부호 비트가 분명히 없기 때문에).

0

실제 하드웨어에서 음수의 구현은 디자이너가 선택한 것에 따라 다릅니다. 일반적으로 서명 숫자는 Two's Complement

표현하지만 거기에있다 Many More

관련 문제