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

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입니까, 아니면 컴파일러 확장입니까?



답변

unsigned실제로는의 속기 unsigned int이며 표준 C에서 정의됩니다.


답변

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


답변

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


답변

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

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

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

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


답변

C 및 C ++에서

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

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

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

부호있는 정수는 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.


답변

다른 질문에서대답을 가져 옵니다 .

로부터 C 사양 , 섹션 6.7.2 :

— unsigned 또는 unsigned int

것을 의미 unsigned유형을 지정하지 않을 경우, 기본값한다 unsigned int. 따라서 쓰기 unsigned aunsigned int a.