size_t는 항상 서명되지 않습니까?
제목으로 : size_t는 항상 서명되지 않습니다. 즉, for size_t x
는 x
항상 >= 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_t
instddef.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
'developer tip' 카테고리의 다른 글
aps-environment는 항상 개발입니다. (0) | 2020.12.24 |
---|---|
커밋을위한 Mercurial 체리 따기 변경 (0) | 2020.12.15 |
정적 메서드 내에서 세션 변수의 값을 어떻게 얻을 수 있습니까? (0) | 2020.12.15 |
iPhone 웹 응용 프로그램에서 스크롤을 비활성화 하시겠습니까? (0) | 2020.12.15 |
TortoiseSVN을 사용하여 이전 버전으로 되돌리기 (0) | 2020.12.15 |