programing

C의 부호 없는 값

telecom 2023. 10. 17. 20:01
반응형

C의 부호 없는 값

다음 코드가 있습니다.

#include <stdio.h>

int main() {
    unsigned int a = -1;
    int b = -1;
    printf("%x\n", a);
    printf("%x\n", b);

    printf("%d\n", a);
    printf("%d\n", b);

    printf("%u\n", a);
    printf("%u\n", b);
    return 0;
}

출력은 다음과 같습니다.

ffffffff
ffffffff
-1
-1
4294967295
4294967295

다음으로 전달된 값에 따라 값이 서명된 것으로 해석되거나 서명되지 않은 것으로 해석되는 것을 볼 수 있습니다.printf기능.두 경우 모두 바이트 수는 동일합니다(ffffffff). 그렇다면 무엇입니까?unsigned단어는?

할당합니다.int -1완전히unsigned: 아-1범위에 맞지 않음[0...UINT_MAX], 몇 배의UINT_MAX+1답변이 범위에 도달할 때까지 추가됩니다.분명히UINT_MAXpow(2,32)-1 or 429496725OP의 기계에서도 4294967295의 값이 있습니다.

unsigned int a = -1;

"%x","%u"지정자가 일치할 것으로 예상합니다.unsigned. 이 값이 일치하지 않으므로 "변환 규격이 올바르지 않으면 동작이 정의되지 않습니다.인수가 해당 변환 규격에 대한 올바른 유형이 아니면 동작이 정의되지 않습니다." C11 §7.21.6.19.인쇄 지정자가 변경되지 않습니다.b.

printf("%x\n", b);  // UB
printf("%u\n", b);  // UB

"%d"지정자가 일치할 것으로 예상합니다.int. 이것들이 일치하지 않기 때문에, 더 많은 UB.

printf("%d\n", a);  // UB

정의되지 않은 동작을 고려할 때 결론은 지원되지 않습니다.


두 경우 모두 바이트가 동일합니다(fffffffff).

같은 비트 패턴이라도 종류에 따라 값이 다를 수 있습니다.ffffffff…로서unsigned는 4294967295의 값을 가집니다.아산으로서int, 부호화된 정수 부호화에 따라 -1, -2147483647 또는 TBD 값을 갖습니다.로서floatNAN일 수도 있습니다.

부호 없는 단어는 무엇을 뜻합니까?

unsigned정수를 범위에 저장합니다.[0 ... UINT_MAX]. 그것은 결코 부정적인 값을 가지지 않습니다.코드에 음수가 아닌 숫자가 필요한 경우 사용unsigned. 코드에 +, - 또는 0일 수 있는 카운팅 번호가 필요한 경우 다음을 사용합니다.int.


업데이트: 컴파일러가 서명된 서명을 할당하는 것에 대한 경고를 방지합니다.int로.unsigned, 아래의 내용을 사용합니다.이거는.unsigned 1u부정되는 것 - 위와 같이 잘 정의되어 있습니다.효과는 a와 같습니다.-1, 컴파일러에게 직접적인 의도를 전달합니다.

unsigned int a = -1u;

하고 있다unsigned변수 선언은 프로그래머 자신에게 더 유용합니다. 변수를 부정적으로 취급하지 마십시오.당신이 알아차렸다시피, 둘 다-1그리고.42949672954바이트 정수에 대해 정확히 동일한 비트 표현을 갖습니다.그들을 어떻게 대하거나 보고 싶은지가 중요합니다.

성명서unsigned int a = -1;변환 중입니다.-1둘의 보어와 비트 표현을 할당합니다.a.그printf()명세자x,d그리고.u비트 표현이 변수에 저장되는 방식을 보여주고 있습니다.a형식이 다른 것 같습니다.

초기화 시unsigned int a to -1;그것은 당신이 의 보어를 기억 속에 저장하고 있다는 것을 의미합니다.a.
그것은 단지.0xffffffff아니면4294967295.

따라서 를 사용하여 인쇄할 때%x or %u포맷 지정자는 그 출력을 얻을 수 있습니다.

변수의 부호를 지정하여 저장 가능한 값의 최소 및 최대 한도를 결정합니다.

처럼.unsigned int: 범위는 ~입니다.0 to 4,294,967,295그리고.int: 범위는 ~입니다.-2,147,483,648 to 2,147,483,647

서명 여부에 대한 자세한 내용은 다음을 참조하십시오.

언급URL : https://stackoverflow.com/questions/32344810/unsigned-values-in-c

반응형