为什么常量的类型修饰符?

时间:2017-03-24 07:51:05

标签: c++

我无法理解文字常量的类型修饰符的用途,例如数值常量:

75 
75u     
75l  
75ul
75lu 

在哪些情况下这可能有用?我的意思是如果你已经为变量类型声明了一个类型修饰符,我认为没有必要这样做。如果有人能帮助我理解这一点,那就太棒了!谢谢!

奖金问题:“文字”是否与“常数”相同,您是否只能说“文字”而不是“文字常量”?

3 个答案:

答案 0 :(得分:8)

有时文字必须具有特定类型。例如

void foo(const int&){
    // pay myself
}

void foo(const unsigned&){
    // reformat my disk
}

然后foo(75)foo(75u)会产生截然不同的结果。

事实上,它是所以有用,从C ++ 11可以定义自己的文字类型。见http://en.cppreference.com/w/cpp/language/user_literal

答案 1 :(得分:3)

对于整数文字,除了Bathsheba的答案之外,它还用于抑制警告等各种情况

unsigned int n = somevalue;
...
if (n > 5) dosomething();

更改为if (n > 5U)并且不再有警告。

或者当你做这样的事情时

long long x = 1 << 50;

并意识到x不是您所期望的,您需要将其更改为

long long x = 1LL << 50;

另一种用法是针对C ++ 11中的auto关键字

auto a = 1;
auto b = 1U;
auto c = 1L;
auto d = 1UL;

以上将导致变量

的类型不同

对于浮点文字,使用后缀将产生更正确的结果

long double a = 0.01234567890123456789;
long double a = 0.01234567890123456789L;

那些may result in very very different values。这是因为没有后缀的文字是double字面值,并且会正确舍入到双倍,因此当long double的精度高于double时,它会导致精度丢失。由于double-rounding导致float s发生同样的情况(首先是双倍然后浮动,而不是直接围绕文字浮动)

if (0.67 == 0.67f)
   std::cout << "Equal";
else 
   std::cout << "Not Equal";

The above will print out "Not Equal"

What is the difference between casting to float and adding f as a suffix when initializing a float?

答案 2 :(得分:0)

我看到这种情况的最常见情况之一是75ul << 18。转换的输入需要有足够的位来允许该转换。 75可能是16位,超过18位未定义行为(坏)。 75ul至少为32位。