当前位置:  开发笔记 > 编程语言 > 正文

如何在C++中编写一个简短的文字?

如何解决《如何在C++中编写一个简短的文字?》经验,为你挑选了6个好方法。

非常基本的问题:如何short用C++ 编写文字?

我知道以下内容:

2 是一个 int

2U 是一个 unsigned int

2L 是一个 long

2LL 是一个 long long

2.0f 是一个 float

2.0 是一个 double

'\2'是一个char.

但是我怎么写short文字呢?我尝试了,2S但它给出了编译器警告.



1> 小智..:
((short)2)

是的,它不是一个简短的文字,更像是一个铸造的int,但行为是一样的,我认为没有直接的方法.

这就是我一直在做的事情,因为我找不到任何关于它的东西.我猜想编译器会很聪明地编译它,好像它是一个短文字(即它实际上不会分配一个int,然后每次都抛出它).

以下说明您应该担心多少:

a = 2L;
b = 2.0;
c = (short)2;
d = '\2';

编译 - >反汇编 - >

movl    $2, _a
movl    $2, _b
movl    $2, _c
movl    $2, _d


上面的a,b,c和d有哪些类型?
无需反汇编 - "gcc -S"生成汇编代码.
@Ates Goral:所有的一切.改为short或char可能会改变整个板上移动或移动的指令.
这不是短文字.当您使用该转换并使用GCC和选项-Wconversion进行编译时,您仍然可以获得语句`short foo = 1; foo + =(短)2;`.但由于整数提升,这无法避免.

2> 小智..:

C++ 11为您提供了非常接近您想要的东西.(搜索"用户定义的文字"以了解更多信息.)

#include 

inline std::uint16_t operator "" _u(unsigned long long value)
{
    return static_cast(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(value);
}


`short`在物理上不能是`std :: uint`anything,因为它是签名类型.并且它不需要是16位或与`std :: int16_t`相同的类型......如果平台无法提供精确宽度类型,则在给定实现中甚至不需要_exist_.这个答案的核心思想是好的,但它被OP没有提出的无关紧要的不相关类型的贬值贬值.

3> Michael Burr..:

即便是C99标准的作者也因此而陷入困境.这是Danny Smith的公共领域stdint.h实现的片段:

/* 7.18.4.1  Macros for minimum-width integer constants

    Accoding to Douglas Gwyn :
    "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."
*/



4> Alexander Re..:

如果您使用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上找到这些后缀的任何信息.



5> 小智..:

您还可以使用伪构造函数语法.

short(2)

我发现它比铸造更具可读性.


它被称为"功能性演员表达".我非常喜欢它,特别是在使用Windows API进行编程时.

6> unwind..:

据我所知,你没有,没有这样的后缀.但是,如果整数文字太大而无法容纳您尝试存储的任何变量,大多数编译器都会发出警告.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有