D (The Programming Language)/d2/Types, Continued

Lesson 4: Types, Continued Edit

In this lesson, you will see all the other types. Many of these types will be familiar, but be aware that there are many differences between C and D in their built-in types.

Introductory Code Edit

All-in-One Edit

import std.stdio;

void main()
    bool a; // default initialized to false
    a = 1;
    a = false;

    uint aa = 53;  //unsigned int
    ulong bb = 10395632;  //unsigned long
    short cc = 100;
    ushort dd = cc;  //dd == 100
    byte b = 0x5E;
    writeln(b); // prints 94
    b = 110;
    ubyte c = 255; //maximum value for a ubyte
    assert(c ==  ubyte.max);
    short d = 50;
    long e = d;
    writeln(e); // 50
    float f;  // default initialized to float.nan
    float g = 3.13;
    double h = g * 2.5;
    // largest hardware implemented floating-point
    real i = 373737373737377373.0;
    writeln(i); // 3.73737e+17
    // these numbers are not real:
    idouble j; //default = double.nan * 1.0i
    ifloat k;
    ireal l;
    cfloat m = 5 + 32.325i;  // a complex number
    // unsigned 8-bit UTF-8
    char n;  // default initialized to 0xFF
    n = 'm';
    writeln(n);  // m
    // unsigned 16-bit UTF-16
    wchar o;  // default = 0xFFFF
    // unsigned 32-bit UTF-32
    dchar p;  // default = 0x0000FFFF

Concepts Edit

Assertion Edit

Using assert allows you to check if a certain expression is true or not. == means is equal to (do not confuse this with =, which is for assigning variables). The checking is done at runtime, and if whatever is inside the parentheses evaluates to false, then an Assertion Error will happen and the program will terminate.

void main()
    bool a = true;
    assert(2346924);  // anything that's not 0 or false
    // assert(false);  Assertion failure
    int i = 4628;
    assert(i == 4628);  // (i == 4628) evaluates to true
    assert(i != 4528);  // (i != 4528) evaluates to true
    assert(i >= 0); // yes, i is greater or equal to 0

Properties and Default Initializers Edit

Types have default initializers. That means, if they are declared but not assigned any value, they will be equal to something by default.

int i;  //i = int.init
assert(int.init == 0);  // i is definitely 0
float b = float.init;  //b = float.nan

Properties can be queried from any type or object. When a property of a type or object is queried, a dot goes between the property name and the identifier.


The init property of any type contains the value that objects of such a type are initialized to by default. For numeral types, you can find the min and max values with their respective properties: type.min and type.max. You can also find the size of a type in memory: type.sizeof. If you want to declare but don't want to initialize something, you can do this:

int i = void;

Then, i is uninitialized; its value is undefined garbage.

A Bit of D's Lexical Grammar Edit

D allows you to write numbers in a few useful bases and forms. So, if you wanted to add the hexadecimal number of A4 to one million three hundred thirteen thousand six hundred thirty-seven and the binary number of 1011010101, you can write this:

import std.stdio;

void main()
    writeln(0xA4 + 1_113_637 + 0b10_11_010101);
    // hex numbers are prefixed by 0x    
    // binary numbers by 0b
    // the answer is 1114526

Note that underscores in the middle of numbers are completely ignored. They are 100% optional and are useful for formatting long numbers.

Tips Edit

  • You may look through this reference for more information about D's lexical grammar. Soon a lesson will be written that contains up-to-date information on the subject.