문제

매우 기본적인 질문 : 어떻게 작성합니까? short C ++의 문자?

다음을 알고 있습니다.

  • 2 이다 int
  • 2U 이다 unsigned int
  • 2L a long
  • 2LL a long long
  • 2.0f a float
  • 2.0 a double
  • '\2' a 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)

나는 캐스팅보다 더 읽기 쉬운 것을 발견했다.

내가 아는 한, 당신은 그런 접미사가 없습니다. 그러나 대부분의 컴파일러는 정수 문자가 너무 커서 저장하려는 변수에 맞지 않을 경우 경고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top