본문 바로가기

카테고리 없음

[C++] -1U, -1ULL

visual sutio를 사용하다 보니 -1U 부분에

    "단항 빼기 연산자가 부호 없는 형식에 적용되었습니다. 결과는 역시 unsigned입니다."

라는 에러가 등장해서 찾아보았다.

 

컴파일러 경고(수준 2) C4146 | Microsoft Learn

 

컴파일러 경고(수준 2) C4146

자세한 정보: 컴파일러 경고(수준 2) C4146

learn.microsoft.com

 

 해당 에러(경고)는 나오듯이, 단항 빼기 연산자가 unsigned 타입에 적용될 때 나타난다.

 단항 빼기 연산자는 -3, -(-5.5)처럼 피연산자의 부호를 반전시키는 역할을 한다. (--는 전위/후위 감소 연산자)

 하지만 unsigned는 항상 양수이므로 -를 붙여 음수로 만드는 상황을 비정상이라 볼 수도 있다.

 

 -1U를 사용하는 이유는 정수의 최대값을 쉽게 표현하기 위해서다.

 unsigned int의 최대값은 0xFFFFFFFF인데, 이는 비트로 -1과 동일하다.

cout << -1U << endl;        // 4294967295
cout << 0xFFFFFFFF << endl; // 4294967295

 

 visual studio는 대신 <climits>나 <limits>를 사용할 것을 권장하지만, 코드를 컴파일하고 싶다면 SDL을 꺼야 한다.

 

/sdl(추가 보안 검사 사용) | Microsoft Learn

 

/sdl(추가 보안 검사 사용)

Microsoft C/C++ 컴파일러 /sdl 옵션을 사용하면 권장되는 SDL(보안 개발 수명 주기) 검사 및 경고를 사용할 수 있습니다.

learn.microsoft.com

 visual studio에서는 보안을 위해 더 엄격한 SDL 검사를 기본적으로 켜둔다.

 SDL은 몇몇 경고를 오류로 승격하고, 추가적인 런타임 검사를 실행한다.

 

이를 끄고 싶다면, 프로젝트 속성 - C/C++ - 일반 - SDL 검사에서 비활성화할 수 있다.