developer tip

size_t는 항상 서명되지 않습니까?

copycodes 2020. 12. 15. 19:28
반응형

size_t는 항상 서명되지 않습니까?


제목으로 : size_t는 항상 서명되지 않습니다. 즉, for size_t xx항상 >= 0?


. 그것은있어 보통 (32 비트 시스템)는 다음과 같이 정의 :

typedef unsigned int size_t;

참고:

C ++ 표준 18.1 절을 정의는 size_t<cstddef>있는로 C 표준에 설명되어 있습니다 <stddef.h>.
C 표준 섹션 4.1.5는 연산자 size_t결과의 부호없는 정수 유형으로 정의합니다.sizeof


1999 ISO C 표준 (C99)에 따르면 size_t최소 16 비트의 부호없는 정수 유형입니다 (섹션 7.17 및 7.18.3 참조).

이 표준은 또한 권장 size_t보다 정수 변환 순위 이상을하지 말았어야 long, 즉 주조 가능한 경우 size_t에이 unsigned long권고를 따르지 않은 경우에는 문제입니다.

1989 ANSI C 표준 (ANSI C)은 최소 크기 또는 권장 변환 등급을 언급하지 않습니다.

1998 년 ISO C ++ 표준 (C ++ 98) (C ++ 0x에 대한 현재 초안 포함)은 C 표준을 참조합니다. 섹션 18.1은 다음과 같습니다.

내용은 표준 C 라이브러리 헤더 <stddef.h>[...] 와 동일합니다 .

섹션 1.2에 따르면 이는 1995 년 (C95)의 첫 번째 수정 사항을 포함하여 1990 ISO C 표준 (C90)에 정의 된 라이브러리를 의미합니다.

ISO / IEC 9899 : 1990의 7 절과 ISO / IEC 9899 / Amd.1 : 1995의 7 절에 설명 된 라이브러리를 이후 표준 C 라이브러리 라고합니다 .

관련 부품 size_t은 ANSI C : Frontmatter 및 섹션 번호 지정을 제외하고 C90 및 ANSI C에 대한 표준이 동일합니다. 에 대한 관련 변경 사항이 없는지 확인하기 위해 규범 수정본의 사본이 필요 stddef.h하지만 의심 스럽습니다. 최소 크기는 stdint.h, 즉 C99 와 함께 도입 된 것으로 보입니다 .

C ++ 98 섹션 1.2의 다음 인용문도 고려하십시오.

모든 표준은 개정 될 수 있으며,이 국제 표준을 기반으로 한 계약 당사자는 아래 표시된 표준의 최신 버전을 적용 할 가능성을 조사하도록 권장됩니다.


예, size_t는 부호없는 유형이 보장됩니다.


표준에 따르면 서명되지 않았지만 일부 이전 구현에서는 typedef에 서명 된 유형을 사용했습니다.

이전 GCC 문서에서 :

릴리스 2.4 이전의 GCC 버전 및 size_t 유형에 잠재적 인 문제가 있습니다. ANSI C에서는 size_t항상 서명되지 않은 유형이어야합니다. 기존 시스템의 헤더 파일과의 호환성을 위해 GCC는 size_tin stddef.h을 시스템에서 sys/types.h정의하는 모든 유형으로 정의합니다. size_t에서 정의하는 대부분의 Unix 시스템 sys/types.h은 서명 된 유형으로 정의합니다. 라이브러리의 일부 코드 size_t는 서명되지 않은 유형 에 의존 하며 서명 된 경우 올바르게 작동하지 않습니다.

그것에 대해 경계하는 것이 얼마나 중요한지 잘 모르겠습니다. 내 코드는 서명되지 않은 것으로 가정합니다.


size_t는 C 표준과 동일한 정의를 따라야하며 C ++ 표준의 여러 위치에서 서명되지 않은 자연 (특히 할당 자 템플릿 인수 정의)을 의미합니다.

C ++ 표준, 섹션 18.1 (ISO / IEC 14882-초판 1998-01-01) :

표 15는 정의 된 유형으로 나열됩니다 : ptrdiff_t 및 size_t

3 내용은 표준 C 라이브러리 헤더와 동일하지만 다음과 같은 변경 사항이 있습니다. 4 NULL 매크로는이 국제 표준 (4.10)에서 구현 정의 C ++ 널 포인터 상수입니다.

offsetof 매크로는이 국제 표준에서 제한된 유형 인수 집합을 허용합니다. 유형은 POD 구조 또는 POD 공용체 (9 절)입니다. 정적 데이터 멤버 또는 함수 멤버 인 필드에 offsetof 매크로를 적용한 결과가 정의되지 않았습니다. 다음도 참조 : 하위 절 5.3.3, Sizeof, 하위 절 5.7, 추가 연산자, 하위 절 12.5, Free store 및 ISO C 하위 절 7.1.6.


오, 이것은 끔찍합니다.

vector<MyObject> arr;
Fill(arr);
size_t size = arr.size();
for(size_t i = 1; i < size - 1; ++i)
{
  auto obj = arr[i];
  auto next = arr[i+1];
}

이제 arr이 비어있는 사용 사례를 고려하십시오.

참조 URL : https://stackoverflow.com/questions/1089176/is-size-t-always-unsigned

반응형