273

In C/C#/etc. you can tell the compiler that a literal number is not what it appears to be (ie., float instead of double, unsigned long instead of int):

var d = 1.0;  // double
var f = 1.0f; // float
var u = 1UL;  // unsigned long

etc.

Could someone point me to a list of these? I'm specifically looking for a suffix for short or Int16.

alamoot
  • 1,966
  • 7
  • 30
  • 50
3Dave
  • 28,657
  • 18
  • 88
  • 151
  • 1
    see here: http://stackoverflow.com/questions/166752/c-compiler-number-literals – fixagon Apr 28 '11 at 15:07
  • possible duplicate of [Defining different types of numbers in C#](http://stackoverflow.com/questions/262555/defining-different-types-of-numbers-in-c) – Daniel Renshaw Apr 28 '11 at 15:08

5 Answers5

435
var d  = 1.0d;  // double
var d0 = 1.0;   // double
var d1 = 1e+3;  // double
var d2 = 1e-3;  // double
var f  = 1.0f;  // float
var m  = 1.0m;  // decimal
var i  = 1;     // int
var ui = 1U;    // uint
var ul = 1UL;   // ulong
var l  = 1L;    // long

I think that's all... there are no literal specifiers for short/ushort/byte/sbyte

AustinWBryan
  • 3,249
  • 3
  • 24
  • 42
Thomas Levesque
  • 286,951
  • 70
  • 623
  • 758
54

From Integer literals:

The type of an integer literal is determined as follows:

  • If the literal has no suffix, it has the first of these types in which its value can be represented: int, uint, long, ulong.
  • If the literal is suffixed by U or u, it has the first of these types in which its value can be represented: uint, ulong.
  • If the literal is suffixed by L or l, it has the first of these types in which its value can be represented: long, ulong.
  • If the literal is suffixed by UL, Ul, uL, ul, LU, Lu, lU, or lu, it is of type ulong.

And from Real literals:

If no real type suffix is specified, the type of the real literal is double. Otherwise, the real type suffix determines the type of the real literal, as follows:

  • A real literal suffixed by F or f is of type float. For example, the literals 1f, 1.5f, 1e10f, and 123.456F are all of type float.
  • A real literal suffixed by D or d is of type double. For example, the literals 1d, 1.5d, 1e10d, and 123.456D are all of type double.
  • A real literal suffixed by M or m is of type decimal. For example, the literals 1m, 1.5m, 1e10m, and 123.456M are all of type decimal. This literal is converted to a decimal value by taking the exact value, and, if necessary, rounding to the nearest representable value using banker's rounding (Section 4.1.7). Any scale apparent in the literal is preserved unless the value is rounded or the value is zero (in which latter case the sign and scale will be 0). Hence, the literal 2.900m will be parsed to form the decimal with sign 0, coefficient 2900, and scale 3.
Squirrelkiller
  • 2,575
  • 1
  • 22
  • 41
BoltClock
  • 700,868
  • 160
  • 1,392
  • 1,356
10

If your variable isn't already a short, you have to cast it explicitly :

Object s = (Int16) 1;
Chris
  • 4,212
  • 5
  • 37
  • 52
6

There isn't one for short. Just use short s = 1;.

Random832
  • 37,415
  • 3
  • 44
  • 63
  • 2
    Interestingly this compiles: `short z1 = (0 == 1 ? 0 : 1);` But this does not: `short y = 1; short z2 = (0 == 1 ? 0 : y);` (sorry, no line breaks allowed in comments) – yoyo Mar 08 '16 at 22:24
  • 4
    @yoyo: That's because the `0` in the if branch is converted to an `int` **before** the assignment to `z2`. If you use two `short`s in your branches, the result will again be a `short`. With the if/else, the compiler can't know that your `int` can be represented as `short`. – Oliver Apr 03 '17 at 08:58
1
var myValue = unchecked((short)0x7F00);

The literal is int and thus must be cast to target type. If a value overflow occurs unchecked is required.

Greg Burghardt
  • 17,900
  • 9
  • 49
  • 92
Tom Schardt
  • 470
  • 1
  • 7
  • 18