서명 된 int를 부호없는 int에 할당하려고했습니다.signed int와 unsigned int 사이를 변환하는 동안 형식 변환이 필요합니까?
#include <stdio.h>
int main()
{
int a;
unsigned int b;
scanf("%d", &a);
b = a;
printf("%d %u\n", a, b);
return 0;
}
나는이 컴파일하는 것은 내가 부호없는 INT 변수에 int 값을 할당 오전 경고를 일으킬 것이라고 기대했다. 그러나 나는 어떤 경고도 얻지 못했습니다. .
$ gcc -std=c99 -Wall -Wextra -pedantic foo.c
$ echo -1 | ./a.out
-1 4294967295
다음으로 서명 된 int에 부호없는 int를 할당하려고했습니다.
#include <stdio.h>
int main()
{
int a;
unsigned int b;
scanf("%u", &b);
a = b;
printf("%d %u\n", a, b);
return 0;
}
경고가 표시되지 않습니다.
$ gcc -std=c99 -Wall -Wextra -pedantic bar.c
$ echo 4294967295 | ./a.out
-1 4294967295
두 질문 :
에는 경고가 입력 가 변환 중에 수정됩니다하더라도 이러한 경우에 생성되지 않습니다 왜- ?
- 두 경우 모두 유형 캐스트가 필요합니까?
나는 마지막 줄에 동의하지 않는다. 캐스트는 자체 문서화 코드로 사용할 수 있습니다. "* 예, 값을 잘라내거나 기호를 변경하지만, 의도적으로 * 수행하고 있습니다." MISRA와 같은 많은 코딩 표준에는 캐스트가 필요합니다. – atturri
@atturri 의견이 맞지 않습니다. 캐스트는 똑같이 잘 나타낼 수 있습니다. "나는 경고를 받았고 사라져 버리고 싶었습니다."- 여러분이 던지더라도 코드는 여전히 도청되었지만 이제는 누군가가'-Wconversion'을 사용하여 잠재적 인 버그를 찾으면 그것을 간과 할 것입니다. 예. MISRA는 끔찍한 IMHO입니다. –
@atturri : 캐스트는 항상 자신이하는 일에 대해 _explicit_하지만 자체적으로 문서화 할 수는 없습니다. 암시 적 변환은 명시 적 변환보다 더 이상의 정보를 잃지 않습니다. –