의도가 명확한 것은 좋습니다. 이 값은 long long 값이다, 라는 걸 명확하게 드러내는 게 나쁠 건 없죠.
그리고 워닝이란 건 없을수록 좋습니다. 컴파일러가 워닝을 띄우는 건 그게 좋지 않을 수 있으니까 워닝을 띄우는 겁니다. 설령 그 워닝이 프로그램의 동작에 영향을 미치지 않는다는 것을 알더라도, 그 워닝이 뜨지 않게끔 처리해줘야 다른 워닝들이 뜨더라도 섞이지 않고 쉽게 찾을 수 있습니다.
이런 것도 버릇을 들여놓는 게 좋겠군요. 감사합니다!
상수의 타입을 명확히 표시해야만 문제가 발생하지 않는 경우도 있습니다. 예를 들어, 2^20 같은 값이 필요하다면 보통 아래와 같은 비트 연산을 사용합니다.
1 << 20
하지만 만약 n의 범위가 32비트 정수형에 담을 수 없는 크기의 경우(2^40 이라든가), 위와 같은 방식으로 1 << 40으로 적으면 오버플로우가 발생합니다. 1도 40도 int형이기 때문에 결과도 int형으로 인식하기 때문입니다. 즉,
long long k = 1 << 40;
이 코드는 k가 64비트 정수형이라 하더라도 오버플로우로 인해 이상한 값이 들어가게 됩니다. 이걸 피하려면 아래와 같이 상수에 타입을 명시해주어야 합니다.
long long k = 1ll << 40;
상수에도 타입이 있고, 그 타입으로 인해 연산의 결과가 전혀 달라질 수 있기 때문에 정확히 자신이 필요한 상수의 타입에 맞춰서 명시를 해주는 것이 좋습니다. djm님 말씀처럼 컴파일러의 경고는 말 그대로 이 코드는 위험할 수 있다는 경고기 때문에, 경고가 발생하지 않게 코드를 짜는 버릇을 들이는게 도움이 됩니다.
댓글을 작성하려면 로그인해야 합니다.
ckrmsckrms19 5년 전
현재 백준 강의를 들으며 문제를 풀어가고 있습니다. 가끔식 예제 풀이 코드를 보면 'LL'과 같은 suffix를 사용하신 것을 보게 됩니다.
아마도 Compiler가 type conversion warning 하는 것을 피하시려고 하는 것 같은데... 이게 아니라면 왜 쓰신 걸까요? 그리고 만약 그런 의도시라면 보통 그런 warning은 무시하고 말지 않나요?
밑에는 LL suffix를 사용하신 한 코드입니다.