리터럴 식에도 형식이 있습니까?C++ 리터럴 정수 형식
long long int a = 2147483647+1 ;
long long int b = 2147483648+1 ;
std::cout << a << ',' << b ; // -2147483648,2147483649
리터럴 식에도 형식이 있습니까?C++ 리터럴 정수 형식
long long int a = 2147483647+1 ;
long long int b = 2147483648+1 ;
std::cout << a << ',' << b ; // -2147483648,2147483649
예, 문자 숫자에는 유형이 있습니다. 접미사가 붙지 않은 10 진 정수 리터럴 유형은 int
, long
, long long
중 첫 번째 정수로 나타낼 수 있습니다. 2 진수, 16 진수 및 8 진수의 유형은 유사하게 선택되지만 목록의 부호없는 유형도 사용됩니다.
U
접미사를 사용하여 서명되지 않은 형식을 사용할 수 있습니다. 접미어에 L
을 하나만 사용하는 경우 유형은 long
일 수 있지만 long
으로 표시 될 수없는 경우 유형은 long long
일 수 있습니다. LL
을 사용하는 경우 유형은 long long
이어야합니다.
결과는하다 int
32 비트 유형이고 long
는, 64 비트는 다음 2147483647
long
을 int
2147483648
동안 입력했다 입력 경우. 즉, 2147483647+1
은 오버플로 (이는 정의되지 않은 동작 임)이며 2147483648+1
은 간단히 2147483649L
입니다.
이것은 C++ 표준의 § 2.3.12 ([lex.icon]
) 단락 2에 의해 정의되며 위의 설명은 해당 섹션의 표 7에 대한 요약입니다.
할당 대상의 유형은 어떤 식 으로든 할당 오른쪽의 표현식 값에 영향을 미치지 않습니다. 계산을 long long
결과로 강제하려면 계산의 일부 인수를 강제로 long long
으로 설정해야합니다. 단지 long long
변수에 할당하는 것은 충분하지 않다 : 요는 'A + 1` 첫째을하고 오래 오래에 캐스팅 때문에
long long a = 2147483647 + 1LL;
std::cout << a << '\n';
는
2147483648
int a = INT_MAX ;
long long int b = a + 1 ; // adds 1 to a and convert it then to long long ing
long long int c = a; ++c; // convert a to long long int and increment the result with 1
cout << a << std::endl; // 2147483647
cout << b << std::endl; // -2147483648
cout << c << std::endl; // 2147483648
cout << 2147483647 + 1 << std::endl; // -2147483648 (by default integer literal is assumed to be int)
cout << 2147483647LL + 1 << std::endl; // 2147483648 (force the the integer literal to be interpreted as a long long int)
당신은 정수 리터럴 here에 대한 자세한 정보를 찾을 수 있습니다.
2147483647은 'int' 유형일 수 있지만 긴 유형일 수도 있습니다. 또한 2147483647 + 1은 정수 오버플로가 될 가능성이 있으며, 이는 -2147483648이 아니지만 정의되지 않은 동작입니다. 마지막으로 2147483647L + 1 또한 오버플로 할 수 있습니다 (Microsoft 컴파일러에서도 마찬가지입니다). –
@MartinBonner 필자는 Windows에서 64 비트 인 long long을 사용하도록 내 대답을 변경했습니다. C++ 표준에 따른 정의되지 않은 동작이지만 거의 항상 2 보수 오버플로로 구현되며 이는 OP가 인식 한 동작입니다. – m7913d
@MartinBonner rici의 답변에 따르면, 정수 (int가 32 비트라고 가정 할 경우) – m7913d
을 생산하고 있습니다. –
이것을 확인하면 모든 의문점이 해결됩니다. http://stackoverflow.com/questions/1819189/what-range-of-values-can-integer-types-store-in-c – divyum
보이지 않습니다. long long에 관한 질문은 "리터럴 표현식에도 형식이 있습니까?"라는 질문과 어떻게 관련이 있습니까? –