C ++로 짧은 리터럴을 작성하는 방법
매우 기본적인 질문 : short
C ++에서 리터럴을 어떻게 작성 합니까?
나는 다음을 알고있다 :
2
이다int
2U
이다unsigned int
2L
이다long
2LL
이다long long
2.0f
이다float
2.0
이다double
'\2'
입니다char
.
그러나 어떻게 short
리터럴을 작성합니까? 시도 2S
했지만 컴파일러에 경고가 표시됩니다.
((short)2)
예, 그것은 엄격히 짧은 문자가 아니며, 더 많은 캐스트 캐스트가 아니지만 동작은 동일하며 직접적인 방법이 없다고 생각합니다.
그것이 내가 그것에 대해 아무것도 찾을 수 없기 때문에 내가 한 일입니다. 컴파일러는 이것을 짧은 리터럴 인 것처럼 이것을 컴파일하기에 충분히 똑똑 할 것이라고 생각합니다 (즉, 실제로 int를 할당 한 다음 매번 캐스팅하지는 않습니다).
다음은 이것에 대해 얼마나 걱정해야하는지 보여줍니다.
a = 2L;
b = 2.0;
c = (short)2;
d = '\2';
컴파일-> 분해->
movl $2, _a
movl $2, _b
movl $2, _c
movl $2, _d
C ++ 11은 원하는 것에 매우 가깝습니다. 자세한 내용은 "사용자 정의 리터럴"을 검색하십시오.
#include <cstdint>
inline std::uint16_t operator "" _u(unsigned long long value)
{
return static_cast<std::uint16_t>(value);
}
void func(std::uint32_t value); // 1
void func(std::uint16_t value); // 2
func(0x1234U); // calls 1
func(0x1234_u); // calls 2
// also
inline std::int16_t operator "" _s(unsigned long long value)
{
return static_cast<std::int16_t>(value);
}
C99 표준의 작가들조차도 이것에 사로 잡혔습니다. 다음은 Danny Smith의 퍼블릭 도메인 stdint.h
구현에 대한 스 니펫입니다 .
/* 7.18.4.1 Macros for minimum-width integer constants
Accoding to Douglas Gwyn <gwyn@arl.mil>:
"This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC
9899:1999 as initially published, the expansion was required
to be an integer constant of precisely matching type, which
is impossible to accomplish for the shorter types on most
platforms, because C99 provides no standard way to designate
an integer constant with width less than that of type int.
TC1 changed this to require just an integer constant
*expression* with *promoted* type."
*/
Microsoft Visual C ++를 사용하는 경우 모든 정수 유형에 사용할 수있는 리터럴 접미 부가 있습니다.
auto var1 = 10i8; // char
auto var2 = 10ui8; // unsigned char
auto var3 = 10i16; // short
auto var4 = 10ui16; // unsigned short
auto var5 = 10i32; // int
auto var6 = 10ui32; // unsigned int
auto var7 = 10i64; // long long
auto var8 = 10ui64; // unsigned long long
이들은 비표준 확장 이며 이식 가능하지 않습니다 . 실제로 MSDN에서 이러한 접미사에 대한 정보를 찾을 수도 없었습니다.
의사 생성자 구문을 사용할 수도 있습니다.
short(2)
캐스팅보다 더 읽기 쉽습니다.
내가 아는 한, 그런 접미사는 없습니다. 그러나 대부분의 컴파일러는 정수 리터럴이 너무 커서 변수를 저장하려는 변수에 맞지 않으면 경고합니다.
참고URL : https://stackoverflow.com/questions/208433/how-do-i-write-a-short-literal-in-c
'Programing' 카테고리의 다른 글
확실히 설치된 모듈을 가져올 수 없습니다 (0) | 2020.07.29 |
---|---|
일반적인 방법을 사용하는시기와 와일드 카드를 사용하는시기는? (0) | 2020.07.29 |
주어진 수의 요소로 목록 자르기 (0) | 2020.07.29 |
서버에서받은 중복 헤더 (0) | 2020.07.28 |
안드로이드에 커스텀 라디오 버튼 추가하기 (0) | 2020.07.28 |