Search

4.12 — Literals

In programming, a constant is a fixed value that may not be changed. C++ has two kinds of constants: literal constants, and symbolic constants. We’ll cover literal constants in this lesson, and symbolic constants in the next lesson.

Literal constants (usually just called literals) are values inserted directly into the code. For example:

They are constants because their values can not be changed dynamically (you have to change them, and then recompile for the change to take effect).

Just like objects have a type, all literals have a type. The type of a literal is assumed from the value and format of the literal itself.

By default:

Literal value Examples Default type
integral value 5, 0, -3 int
boolean value true, false bool
floating point value 3.4, -2.2 double (not float)!
char value ‘a’ char
C-style string “Hello, world!” const char[14] (see chapter 6)

Literal suffixes

If the default type of a literal is not as desired, you can change the type of a literal by adding a suffix:

Data Type Suffix Meaning
int u or U unsigned int
int l or L long
int ul, uL, Ul, UL, lu, lU, Lu, or LU unsigned long
int ll or LL long long
int ull, uLL, Ull, ULL, llu, llU, LLu, or LLU unsigned long long
double f or F float
double l or L long double

You generally won’t need to use suffixes for integer types, but here are examples:

By default, floating point literal constants have a type of double. To make them float literals instead, the f (or F) suffix should be used:

New programmers are often confused about why the following doesn’t work as expected:

Because 4.1 has no suffix, it’s treated as a a double literal, not a float literal. When C++ defines the type of a literal, it does not care what you’re doing with the literal (e.g. in this case, using it to initialize a float variable). Therefore, the 4.1 must be converted from a double to a float before it can be assigned to variable f, and this could result in a loss of precision.

C++ supports string literals:

String literals are handled very strangely in C++. For now, it’s fine to use string literals to print text with std::cout, but don’t try and assign them to variables or pass them to functions -- it either won’t work, or won’t work like you’d expect. We’ll talk more about C-style strings (and how to work around all of those odd issues) in future lessons.

Literals are fine to use in C++ code so long as their meanings are clear. This is most often the case when used to initialize or assign a value to a variable, do math, or print some text to the screen.

Scientific notation for floating point literals

There are two different ways to declare floating-point literals:

In the second form, the number after the exponent can be negative:

Octal and hexadecimal literals

In everyday life, we count using decimal numbers, where each numerical digit can be 0, 1, 2, 3, 4, 5, 6, 7, 8, or 9. Decimal is also called “base 10”, because there are 10 possible digits (0 through 9). In this system, we count like this: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … By default, numbers in C++ programs are assumed to be decimal.

In binary, there are only 2 digits: 0 and 1, so it is called “base 2”. In binary, we count like this: 0, 1, 10, 11, 100, 101, 110, 111, …

There are two other “bases” that are sometimes used in computing: octal, and hexadecimal.

Octal is base 8 -- that is, the only digits available are: 0, 1, 2, 3, 4, 5, 6, and 7. In Octal, we count like this: 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, … (note: no 8 and 9, so we skip from 7 to 10).

Decimal 0 1 2 3 4 5 6 7 8 9 10 11
Octal 0 1 2 3 4 5 6 7 10 11 12 13

To use an octal literal, prefix your literal with a 0:

This program prints:

10

Why 10 instead of 12? Because numbers are printed in decimal, and 12 octal = 10 decimal.

Octal is hardly ever used, and we recommend you avoid it.

Hexadecimal is base 16. In hexadecimal, we count like this: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, …

Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11

To use a hexadecimal literal, prefix your literal with 0x.

This program prints:

15

Because there are 16 different values for a hexadecimal digit, we can say that a single hexadecimal digit encompasses 4 bits. Consequently, a pair of hexadecimal digits can be used to exactly represent a full byte.

Consider a 32-bit integer with value 0011 1010 0111 1111 1001 1000 0010 0110. Because of the length and repetition of digits, that’s not easy to read. In hexadecimal, this same value would be: 3A7F 9826. This makes hexadecimal values useful as a concise way to represent a value in memory. For this reason, hexadecimal values are often used to represent memory addresses or raw values in memory.

Prior to C++14, there is no way to assign a binary literal. However, hexadecimal pairs provides us with an useful workaround:

C++14 binary literals and digit separators

In C++14, we can assign binary literals by using the 0b prefix:

Because long literals can be hard to read, C++14 also adds the ability to use a quotation mark (‘) as a digit separator.

If your compiler isn’t C++14 compatible, your compiler will complain if you try to use either of these.

Magic numbers, and why they are bad

Consider the following snippet:

A number such as the 30 in the snippet above is called a magic number. A magic number is a literal (usually a number) in the middle of the code that does not have any context. What does 30 mean? Although you can probably guess that in this case it’s the maximum number of students per class, it’s not absolutely clear. In more complex programs, it can be very difficult to infer what a hard-coded number represents, unless there’s a comment to explain it.

Using magic numbers is generally considered bad practice because, in addition to not providing context as to what they are being used for, they pose problems if the value needs to change. Let’s assume that the school buys new desks that allow them to raise the class size from 30 to 35, and our program needs to reflect that. Consider the following program:

To update our program to use the new classroom size, we’d have to update the constant 30 to 35. But what about the call to setMax()? Does that 30 have the same meaning as the other 30? If so, it should be updated. If not, it should be left alone, or we might break our program somewhere else. If you do a global search-and-replace, you might inadvertently update the argument of setMax() when it wasn’t supposed to change. So you have to look through all the code for every instance of the literal 30, and then determine whether it needs to change or not. That can be seriously time consuming (and error prone).

Fortunately, better options (symbolic constants) exist. We’ll talk about those in the next lesson.

Warning

Don’t use magic numbers in your code.


4.13 -- Const, constexpr, and symbolic constants
Index
4.11 -- Chars

34 comments to 4.12 — Literals

  • linuxx

    Hi! I'm not totally new to C++, but new to this course. (Yes, I'm calling it a "course" 'cause it's better than all other C++ teaching I've come across in the past - THANK YOU SO MUCH!)

    Anyhow... I've been digging through the tutorials very seriously. All of the stuff is really well explained and if a piece of information happens to be missing, it is usually covered by the comments. However, here (in 2.8), I'm a bit lost... Can you explain to me, why we'd want to add an "L" to

    long nValue2 = 5L;

    or an f to

    float fValue = 5.0f;

    ...?

    They have already been declared as being "long" and "float"... So what's the point here...???

    Thx!

  • vitalreddy

    I have doubt in this lesson.......... literal constant and symbolic constant both are same ..what is difference ..which one is best and why ...please give reply for this.. i am confused about this..

    • alexah101

      "Literal constants are literal numbers inserted into the code."
      thus a number like 5 is literal, 10 is literal,
      Ex. x = 10
      x is not literal
      10 is literal

      a symbolic constant is what we think of when we think constants.
      Ex. const int x = 7;
      x is a symbolic constant because x will now always equal 7

  • Beginner

    Hi
    Please let me know how memory is allocated in #define and const?
    What is the difference?

  • marjoonjan

    What happen if we use ';' after the #define? See below for example:

    #include

    #define MAX 100;

    using namespace std;

    main()
    {
    cout << MAX+2 << ' ' << 4+9;
    }

    cout dose not print the result of the 4+9! why?

  • Jupi

    Does #define use up memory just as int does?

  • HORUS793

    Hi.
    I'd like to know which one is better:
    const or #define.
    Thanks in advance...

  • PReinie

    The information is good here, but using "yen per dollar" as a constant is a terrible example. You don't use something that changes multiple times a day as a constant! "yen per dollar" is best used as a variable!

    Use something as an example that doesn't change, like "centimeters per meter", "inches per foot" or "pounds per kilogram".

  • dospy

    there is no such thing like "int = 5" or “int == 5?
    "int" is a keyword used to define variables type

    int nValue;    // declaring nValue as an integer
    nValue = 5;    // assigning value 5 to nValue
    nValue == 5;   // check if nValue is 5, used in if statements
    
    // ex:
    
    if( nValue == 5 )
    {
        cout << "nValue is equal to 5";
    }
    
  • Hi Alex,
    I'm new to c++. My question may be dump to you but what's the difference between "int = 5" or "int == 5".

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">