size_t와 unsigned int의 차이점은 무엇입니까?


107

에 대해 너무 혼란 스럽습니다 size_t. 나는 인터넷에서 검색했으며 모든 곳 size_t에서 서명되지 않은 유형이므로 음수가 아닌 값만 나타낼 수 있습니다.

내 첫 번째 질문은 음수가 아닌 값만 나타내는 데 사용되는 경우 unsigned int대신 사용하지 않는 이유 입니다 size_t.

내 두 번째 질문은 : 있습니다 size_tunsigned int교환 여부? 그렇지 않다면 왜?

그리고 누구든지 size_t그 작동에 대한 좋은 예를 들어 줄 수 있습니까?


5
typedef /*This part is implementation dependent */ size_t;
P0W

5
의 중복 가능성 부호 INT 대를 size_t

답변:


87

음수가 아닌 값을 나타내는 데 사용되는 경우 unsigned int대신 사용 하지 않는 이유size_t

때문에이 unsigned int유일한 부호없는 정수 타입이다. size_t의 하나가 될 수있는 unsigned char, unsigned short, unsigned int, unsigned long또는 unsigned long long, 구현에 따라.

두 번째 질문이다 size_t하고 unsigned int왜 교환 여부이며, 그렇지 않은 경우?

위에 설명 된 이유로 상호 교환 할 수 없습니다 ^^.

그리고 누구든지 내게 size_t와 그것의 간단한 작업의 좋은 예를 줄 수 있습니까?

"간단한 작업"이 의미하는 바를 이해하지 못합니다. 다른 서명되지 않은 유형과 같이 작동합니다 (특히 입력 된 유형과 같이). size_t개체의 크기를 설명 할 때 사용하는 것이 좋습니다 . 특히, sizeof연산자와 같은 다양한 표준 라이브러리 함수 strlen()는 return size_t.

보너스 : 여기size_t(그리고 밀접하게 관련된 ptrdiff_t유형)에 대한 좋은 기사 가 있습니다. 그것은 당신이 그것을 사용해야하는 이유를 아주 잘 설명합니다.


1
정확히 어떻게 될 size_tunsigned char있습니까? 이것이 허용되는 표준입니까? 나는 그 생각으로 어떻게 누군가가 calloc()(및 가족) strlen()등 을 사용할 것으로 기대할 수 있습니까? 그것은 나에게 터무니없는 것 같습니다.
Pryftan

나는 size_t표준에서 "부호없는 정수 유형"으로 정의 되었다고 생각 하지만 unsigned {char, short, int, long, long long}.
Paul Hankin

80

C에는 5 가지 표준 부호없는 정수 유형이 있습니다.

  • unsigned char
  • unsigned short
  • unsigned int
  • unsigned long
  • unsigned long long

크기와 범위에 대한 다양한 요구 사항이 있습니다 (간단히 말하면 각 유형의 범위는 다음 유형 범위의 하위 집합이지만 일부는 동일한 범위를 가질 수 있음).

size_tA는 typedef(위하지만 아마도의 아마 하나 일부 부호없는 형식에 대한 (즉, 별칭)를 확장 부호없는 정수 타입 그 가능성 비록,). sizeof연산자가 산출 한 유형 입니다.

한 시스템에서는 unsigned int크기를 나타내는 데 사용 하는 것이 합리적 일 수 있습니다 . 다른에, 그것을 사용하는 것이 더 적합 할 수 있습니다 unsigned long또는 unsigned long long. ( 또는 일 size_t가능성이 낮지 만 허용됨).unsigned charunsigned short

의 목적은 size_t프로그래머가 크기를 나타내는 데 사용되는 미리 정의 된 유형 에 대해 걱정할 필요가 없도록 하는 것 입니다.

sizeof양보 를 가정 하는 코드는 unsigned int이식 할 수 없습니다. a를 산출한다고 가정하는 코드는 size_t이식성이 더 높습니다.


6
나는 당신이이 size_t 사용해야하는 이유를 설명하기 때문에이 허용 대답해야한다고 생각
kuchi

@ keith-thompson 그렇다면 해당하는 특정 유형 (예 unsigned int: unsigned long, 등)이 size_t코드가 실행되는 시스템에 따라 달라진다는 의미입니까? 즉, 하나의 시스템 아키텍처에서는 이에 해당 unsigned int하지만 다른 아키텍처에서는 해당됩니다 unsigned long.
Richie Thomas

1
@RichieThomas : C 구현에 따라 다릅니다. 동일한 아키텍처에 두 개의 서로 다른 컴파일러는 다른 유형을 선택할 수 있습니다 size_t예를 들어, 특히, unsigned longunsigned long long같은 크기입니다.
Keith Thompson 19

@RichieThomas 그것도 그것의 일부입니다. 즉 long, 의 최대 값 long long등은 시스템에 따라 다릅니다. 살펴보면 limits.h적어도 Unices 아래에서 int의 최대 값이 시스템의 단어 크기에 따라 달라진다는 것을 알 수 있습니다.
Pryftan

1
@Pryftan Motorola 68000 시리즈와 구형 Intel x86 시리즈 (8086 및 8088로 거슬러 올라감)를 살펴보십시오.
Keith Thompson

10

size_t 특정 제한이 있습니다.

http://www.cplusplus.com/reference/cstring/size_t/ 에서 인용 :

기본 부호없는 정수 유형 중 하나의 별칭입니다.

모든 객체의 크기를 바이트 단위로 나타낼 수있는 유형입니다 . size_t는 sizeof 연산자에 의해 반환되는 유형이며 크기와 개수를 표시하기 위해 표준 라이브러리에서 널리 사용됩니다.

unsigned int의 크기 int가 데이터 모델에 의해 지정 되기 때문에 서로 바꿔서 사용할 수 없습니다 . 예를 들어 LLP64는 32 비트를 사용합니다.int 를 사용하고 ILP64는 64 비트를 사용합니다 int.


5
그 인용문은 어디에서 왔습니까? (C 표준이 아닙니다.)
Keith Thompson

2
질문에 c 태그가 지정되었습니다 . C ++ 표준은 C와 관련이 없습니다.
IInspectable 2017 년

7

size_t는 데이터 객체의 크기를 저장하는 데 사용되며 특정 C 구현에서 생성 할 수있는 모든 데이터 객체의 크기를 유지할 수 있습니다. 이 데이터 유형은 더 작거나 (비트 수) 더 크거나 unsigned int와 정확히 동일 할 수 있습니다.


4

다른 답변 외에도 코드를 문서화하고 사람들에게 메모리의 개체 크기에 대해 이야기하고 있음을 알려줍니다.


좋은 지적. An apple사과 이고, a size_t크기입니다 ...
dom_beau

2

size_t 유형은 C / C ++ 언어의 기본 부호없는 정수 유형입니다. sizeof 연산자에 의해 반환 된 결과의 유형입니다. 유형의 크기는 이론적으로 가능한 모든 유형 배열의 최대 크기를 저장할 수 있도록 선택됩니다. 32 비트 시스템에서 size_t는 32 비트를 사용하고 64 비트에서는 64 비트를 사용합니다. 즉, size_t 유형의 변수는 포인터를 안전하게 저장할 수 있습니다. 예외는 클래스 함수에 대한 포인터이지만 이것은 특별한 경우입니다. size_t는 포인터를 저장할 수 있지만 해당 용도로 다른 부호없는 정수 유형 uintptr_t를 사용하는 것이 좋습니다 (이름은 기능을 반영 함). size_t 및 uintptr_t 유형은 동의어입니다. size_t 유형은 일반적으로 루프 카운터, 배열 인덱싱 및 주소 산술에 사용됩니다. size_t 유형의 최대 가능한 값은 constant SIZE_MAX입니다.


1
size_t단일 개체의 크기를 저장할 수 있습니다. 포인터는 모든 개체의 모든 바이트를 가리킬 수 있습니다. 예를 들어 한 개체의 크기를 2 ** 32-1 바이트로 제한하는 64 비트 주소 공간이있는 시스템을 가질 수 있습니다. size_tuintptr_t동일한 유형 이라는 보장은 없습니다 .
Keith Thompson

1

간단히 말해서 size_t는 플랫폼 및 구현에 따라 다르지만 unsigned int는 플랫폼에만 의존합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.