2011-12-08 1 views
0

8 비트 정수 (int8_t)와 32 비트 정수 (int) 사이의 비트 AND를 수행하면 결과가 8 비트 정수 또는 32 비트 정수? 제가C++에서 8 비트 정수와 32 비트 정수 사이의 비트 AND

이 비트를 수행하기 전에 약간 다르게 질문을 넣어 폐기 32 비트 정수의 제 24 비트, 또는 제 캐스트 8 비트 정수되는 GNU/Linux와 GCC 컴파일러를 사용하고

32 비트 정수로?

편집 :이 작은 코드

#include <iostream> 
#include <stdint.h> 
int main() 
{ 
    int i=34; 
    int8_t j=2; 

    std::cout<<sizeof((i&j))<<std::endl;//Bitwise and between a 32 bit integer and 8 bit integer 
    return 0; 
} 

에서 내가 그 가정 것이다 4. 같은 출력 결과가 32 비트 정수는 다음을 의미 얻을. 그러나 결과가 기계, 컴파일러 또는 OS에 달려 있는지 여부는 알 수 없습니다.

+0

당신은 ... – Dan

+0

8 비트 정수 업 캐스팅 아마 그것을 테스트하고 당신이 적어도 당신의 문제를 해결하기 위해 노력했습니다 ... 쇼를 무슨 보는 시도 할 수 있지만, 당신은 항상 만들 캐스트가 명시 적으로 만들 수 있습니다 확실한. – Gnat

+0

@Dan 시도에 대한 편집을 참조하십시오. – smilingbuddha

답변

6

& 연산자 (및 대부분의 다른 연산자)의 경우, 연산이 계산되기 전에 int보다 작은 피연산자는 int으로 승격됩니다.

일반적인 산술 변환은 피연산자에 대해 수행된다 : - (비트 단위 AND 연산자를 설명 6.5.10)에 C99 표준과

.

(6.3.1.8 - 일반적인 산술 변환 기술)

정수 프로모션

두 피연산자에

수행된다 (6.3.1.1 - 설명 정수 프로모션)

int이 원래 유형의 모든 값을 나타낼 수있는 경우 값은 int; 그렇지 않으면 unsigned int으로 변환됩니다. 이를 정수 프로모션이라고합니다. 모든 작업이 그들에 수행되기 전에 int보다 작은

0

정수 유형은 int로 승격된다. CERT Secure Coding Standard에서 "정수 변환 규칙 이해"에 대한 설명을보고 싶을 수도 있습니다.

1

8 비트 정수는 32 비트 정수로 타입 변환됩니다. 비트 단위 연산자는 일반적인 산술 변환을 트리거합니다. 즉, 더 작은 유형이 더 큰 유형과 일치하도록 승격됩니다. 이것은 스펙의 5.1 장에 정의되어 있습니다.

2

언어가 지정하는 것과 관계없이, 질문에 대한 대답은 하나의 피연산자에서 모두 제로 비트이므로 상위 24 비트가 비트와 실행 전에 삭제되면 아무런 문제가되지 않으므로 그 결과

관련 문제