C는 이진 연산자를 어떻게 처리합니까? 표준에 컴파일러가 LVALUE로 변환 할 필요가 있거나 필요하지 않습니까? 이러한 정의와C 바이너리 연산자가 LVALUE 또는 RVALUE의 너비에 적용됨
typedef union {
unsigned long _Data;
struct {
unsigned long _Reserved : 28;
unsigned long _Info : 1;
unsigned long _Reserved2 : 3;
};
} S_INFO;
S_INFO Variable;
,
Variable._Data &= ~3uL;
는 16 비트 아키텍처에서
Variable._Data &= ~3u;
지시 다른 컴파일 명령어를 다음과 같이
구체적인 문제는 내가는 모습을 발견 at, int는 2 바이트 폭이고 4 바이트는 4 바이트입니다.
컴파일러가 & 연산자를 LVALUE Variable._Data 너비가 아닌 리터럴 (RVALUE) 너비에 적용한 것처럼 보입니다.
C 표준에 따라 컴파일러 버그를 발견 했습니까? 아니면이 올바른 동작입니까?
추가 정보는 다음 2 명령은 Variable._Data의 상위 16 비트를 클리어한다. – Coda
밑줄 + 대문자로 시작하는 이름은 구현을 위해 예약되어 있으므로 사용하지 마십시오! (소문자를 사용할 수도 있지만, C에서는 회원들에게 공통적이다.) – Olaf
펜 및 용지를 가져 와서 두 상수의 비트 패턴을 적어 둡니다. 그런 다음 해당 패턴의 표현식을 수동으로 처리하십시오. – Olaf