비트 시프트와 정수 프로모션?
일반적으로 C는 이진 연산자의 피연산자가 상위 피연산자 유형으로 승격되어야 합니다.이를 이용하면 다음과 같은 자세한 캐스트로 코드를 채우는 것을 피할 수 있습니다.
if (x-48U<10) ...
y = x+0ULL << 40;
기타.
하지만 적어도 gcc에서는 이러한 동작이 비트 시프트에서는 작동하지 않는다는 것을 알게 되었습니다.예.
int x = 1;
unsigned long long y = x << 32ULL;
오른쪽 피연산자의 유형에 따라 왼쪽 피연산자가 다음으로 승격될 것으로 예상합니다.unsigned long long전환이 성공하도록 하기 위해서입니다.하지만 대신 GCC는 경고문을 출력합니다.
warning: left shift count >= width of type
gcc가 고장 났나요, 아니면 표준이 비트 시프트에 대한 타입 승격 규칙에 일부 예외를 두나요?
소위 통상적인 산술 변환은 많은 이진 연산자에 적용되지만 모두 적용되는 것은 아닙니다.예를 들어 비트 시프트 연산자, &&, ||, 쉼표 연산자 및 할당 연산자에는 적용되지 않습니다.비트 시프트 연산자에 대한 규칙은 다음과 같습니다.
6.5.7 ... 3 의미론...
각 피연산자에 대해 정수 승격이 수행됩니다.결과 유형은 승격된 왼쪽 피연산자 유형입니다.오른쪽 피연산자의 값이 음수이거나 승격된 왼쪽 피연산자의 너비보다 크거나 같으면 동작이 정의되지 않습니다.
문제는 프로모션이 플랫폼에서 정의하는 대로만 가능하다는 것입니다.int. 일부 다른 답변이 언급된 것처럼, 비트 시프트 연산자는 왼쪽 피연산자를 int로 승격시킵니다.그런데 여기서.int32비트 값으로 정의됩니다.정수 변환이 a로 승격되지 않습니다.long long(64비트).
언급URL : https://stackoverflow.com/questions/3482262/bitshift-and-integer-promotion
'codememo' 카테고리의 다른 글
| jdbc 연결에서 드라이버 클래스 이름(드라이버 이름 아님)을 가져오는 방법 (0) | 2023.10.10 |
|---|---|
| 스택 크기 추정 (0) | 2023.10.10 |
| 로컬 IIS 7.5에서 Windows 인증이 작동하지 않습니다. 오류 401.1 (0) | 2023.10.10 |
| DOM에서 JavaScript 이동 요소 (0) | 2023.10.05 |
| NSURL 요청 HTTP 헤더 설정 (0) | 2023.10.05 |