일반적으로 C는 2 진수의 피연산자가 상위 피연산자의 유형으로 승격되도록 요구합니다. 이것은 예를 들어, 자세한 캐스트로 코드를 작성 피하기 위해 악용 될 수 있습니다비트 및 정수 승격?
if (x-48U<10) ...
y = x+0ULL << 40;
등
는 그러나, 나는 적어도 GCC와 함께,이 문제가 bitshifts 작동하지 않는 것으로 나타났습니다. 나는.
int x = 1;
unsigned long long y = x << 32ULL;
I 시프트가 성공하도록 왼쪽 피연산자가 unsigned long long
로 승격되도록하기 위해 오른쪽 피연산자의 유형을 기대. 하지만 그 대신, GCC 인쇄 경고 : gcc가 고장난 또는 표준 bitshifts의 유형 승격 규칙 일부 예외를 않습니다
warning: left shift count >= width of type
?
경고에 관계없이 어쨌든 홍보 할 계획입니까? (결국 경고 일뿐입니다). –
짧은 매크로를 사용하여 자세한 캐스트를 생성 할 수 없습니까? '#define ULL (x) ((unsigned long long) x)'처럼? – Borealid
@ 로버트 : 아니요. 마치''32'라고 쓰여진 것처럼, 아무런 조작도하지 않습니다. @Borealid : 예, 할 수 있습니다. 그러나 추가 정의/헤더 없이도 어디서나 복사하여 붙여 넣을 수있는 코드를 작성하는 것이 좋습니다 (예 : 다른 프로젝트). 나는'typedef unsigned int uint;'와 같은 것을 싫어한다. –