서명되지 않은 데이터 유형은 무엇입니까?


91

unsigned"타입리스"유형이 몇 번 사용되는 것을 보았지만 이에 대한 설명은 본 적이 없습니다. 해당 signed유형 이 있다고 가정 합니다. 예를 들면 다음과 같습니다.

static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
    next = seed;
}

내가 지금까지 수집 한 내용 :
-내 시스템에서 sizeof(unsigned) = 4(32 비트 unsigned int에 대한 힌트)
-다른 유형을 서명되지 않은 버전으로 캐스팅하는 약어로 사용할 수 있습니다.

signed long int i = -42;
printf("%u\n", (unsigned)i);

이 ANSI C입니까, 아니면 컴파일러 확장입니까?

답변:



31

unsigned의미 unsigned int. signed의미 signed int. 그냥 사용 unsigned하는 unsigned int것은 C에서 선언하는 게으른 방법입니다 . 네, 이것은 ANSI입니다.


15

역사적으로 C에서는 데이터 유형을 생략하면 "int"로 간주됩니다. 따라서 "unsigned"는 "unsigned int"의 약어입니다. 이것은 오랫동안 나쁜 습관으로 여겨져 왔지만 여전히 그것을 사용하는 상당한 양의 코드가 있습니다.


6
나는 그것이 나쁜 습관이라는 것을 몰랐습니다. 이에 대한 근거가 있습니까? long대신에 long int매우 일반적이므로 unsigned대신 unsigned int허용되지 않는 이유 를 모르겠습니다 .
CB Bailey

10
@Charles Bailey : 요즘-적어도 형식적이기보다는 실용적이라면 long, int, short 및 char은 크기가 다를 수 있으므로 다른 데이터 유형으로 간주되며 unsigned (및 기본값, signed)는 한정자. 따라서 "unsigned long"또는 "unsigned char"를 사용하는 것과 동일한 방식으로 "unsigned int"를 사용하는 경향이 있습니다 (그리고 int를 놓친 것이 아님을 분명히합니다). "long int"또는 "short int"의 int는 불필요합니다.
Dipstick

1
@Dipstick, "long"은 "int"의 한정자입니다. "unsigned int"의 int는 "unsigned long int"의 int만큼 불필요한 것 같습니다.
Conrad Meyer

1
이것은 암시 적 "int"규칙과 동일하지 않습니다. 이 대답은 잘못된 것입니다.

8

C에 unsigned대한 바로 가기입니다 unsigned int.

당신을 위해 동일이 long그에 대한 바로 가기입니다long int

그리고 unsigned long( a 가 될 것입니다 unsigned long int) 선언하는 것도 가능합니다 .

이것은 ANSI 표준에 있습니다.


예. unsigned은 동일 unsigned int하지만 난에서 검색 한 WG14 / N1124위원회 초안 - 5 월 6 일 9899 2005 ISO / IEC : TC2 를 들어 unsigned어디 정의 찾을 수 없습니다 ... 당신이 정의 된 부분을 인용 수 있을까?
user454322 2014 년

5

C 및 C ++에서

unsigned = unsigned int (Integer type)
signed   = signed int (Integer type)

n 비트를 포함하는 부호없는 정수는 0과 (2 ^ n-1) 사이의 값을 가질 수 있으며, 이는 2 ^ n 개의 서로 다른 값입니다.

부호없는 정수는 양수 또는 0입니다.

부호있는 정수는 2의 보수를 사용하여 컴퓨터에 저장됩니다.


2

C17 6.7.2 §2에 따르면 :

유형 지정자의 각 목록은 다음 다중 세트 중 하나 여야합니다 (항목 당 다중 세트가 둘 이상인 경우 쉼표로 구분). 형식 지정자는 순서에 관계없이 발생할 수 있으며 다른 선언 지정자와 혼합 될 수 있습니다.

— void
— char
— signed char
— unsigned char
— short, signed short, short int 또는 signed short int
— unsigned short 또는 unsigned short int
— int, signed 또는 signed int
— unsigned 또는 unsigned int
— long, signed long , long int 또는 signed long int
— unsigned long 또는 unsigned long int
— long long, signed long long, long long int 또는 signed long long int
— unsigned long long 또는 unsigned long long int
— float
— double
— long double
— _Bool
— float _Complex
— double _Complex
— long double _Complex
— 원자 유형 지정자
— 구조체 또는 공용체 지정자
— 열거 형 지정자
— typedef 이름

그래서 경우의 unsigned int우리는 하나 쓸 수 있습니다 unsigned하거나 unsigned int, 또는 우리는 미친 기분 경우 int unsigned. 후자는 표준이 "... 어떤 순서로도 발생할 수 있으며, 혼용 될 수 있음"을 허용하기에 충분히 어리석기 때문에. 이것은 언어의 알려진 결함입니다.

적절한 C 코드는 unsigned int.


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