# Built-in Types

## Logical Types

<table data-header-hidden><thead><tr><th width="116.33333333333331">Keyword</th><th width="206">Type</th><th>Values</th></tr></thead><tbody><tr><td>Keyword</td><td>Type</td><td>Values</td></tr><tr><td><code>Bool</code></td><td>Boolean logic type</td><td><code>true</code>  <code>false</code></td></tr></tbody></table>

## Integer Types

<table data-header-hidden><thead><tr><th width="116">Keyword</th><th width="207">Type</th><th width="198">Range</th><th>Example</th></tr></thead><tbody><tr><td>Keyword</td><td>Type</td><td>Range</td><td>Example</td></tr><tr><td><code>Int8</code></td><td>8-bit Signed Integer</td><td><code>-128</code> to <code>127</code></td><td><code>let a: Int8 = 161;</code></td></tr><tr><td><code>Uint8</code></td><td>8-bit Unsigned Integer</td><td><code>0</code> to <code>255</code></td><td><code>let a: Uint8 = 161u;</code></td></tr><tr><td><code>Int16</code></td><td>16-bit Signed Integer</td><td><code>-32,768</code> to <code>32,767</code></td><td><code>let a: Int16 = 161;</code></td></tr><tr><td><code>Uint16</code></td><td>16-bit Unsigned Integer</td><td><code>0</code> to <code>65,535</code></td><td><code>let a: Uint16 = 161u;</code></td></tr><tr><td><code>Int32</code></td><td>32-bit Signed Integer</td><td><code>−2,147,483,648</code> to <code>2,147,483,647</code></td><td><code>let a: Int32 = 161;</code></td></tr><tr><td><code>Uint32</code></td><td>32-bit Unsigned Integer</td><td><code>0</code> to <code>4,294,967,295</code></td><td><code>let a: Uint32 = 161u;</code></td></tr><tr><td><code>Int64</code></td><td>64-bit Signed Integer</td><td><code>−9,223,372,036,854,775,808</code> to <code>9,223,372,036,854,775,807</code></td><td><code>let a: Int64 = 161l;</code></td></tr><tr><td><code>Uint64</code></td><td>64-bit Unsigned Integer</td><td><code>0</code> to <code>18,446,744,073,709,551,615</code></td><td><code>let a: Uint64 = 161ul;</code></td></tr></tbody></table>

You can declare inline numbers using `Cast<T>(value)`. It is useful for `Int8`/`Uint8` and `Int16`/`Uint16` for example:

```swift
// Fake function to use:
public static func UseNumber(a: Int8, ua: Uint8, b: Int16, ub: Uint16) -> Void;

// Use explicit cast
UseNumber(Cast<Int8>(127),
          Cast<Uint8>(255u),
          Cast<Int16>(32767),
          Cast<Uint16>(65535u));
```

## Floating-Point Types

<table data-header-hidden><thead><tr><th width="116.33333333333331">Keyword</th><th width="207">Type</th><th width="219">Range</th><th></th></tr></thead><tbody><tr><td>Keyword</td><td>Type</td><td>Range</td><td>Example</td></tr><tr><td><code>Float</code></td><td>32-bit Single-Precision</td><td>6-9 significant decimal digits (<a href="https://en.wikipedia.org/wiki/Single-precision_floating-point_format">more info</a>)</td><td><code>let a: Float = 3.141592;</code></td></tr><tr><td><code>Double</code></td><td>64-bit Double-Precision</td><td>15-17 significant decimal digits (<a href="https://en.wikipedia.org/wiki/Double-precision_floating-point_format">more info</a>)</td><td><code>let a: Double = 3.141592653589793d;</code></td></tr></tbody></table>

## Literal Types

<table data-header-hidden><thead><tr><th width="145">Keyword</th><th width="190">Type</th><th width="82">Prefix</th><th>Example</th></tr></thead><tbody><tr><td>Keyword</td><td>Type</td><td>Prefix</td><td>Example</td></tr><tr><td><code>String</code></td><td>Mutable character string</td><td></td><td><code>"Hello world"</code></td></tr><tr><td><code>CName</code></td><td>Non-mutable string constant</td><td><code>n</code></td><td><code>n"VehicleComponent"</code></td></tr><tr><td><code>ResRef</code></td><td>Resource reference path</td><td><code>r</code></td><td><code>r"base\\anim_cooked.cookedanims"</code></td></tr><tr><td><code>TweakDBID</code></td><td>TweakDB Record ID</td><td><code>t</code></td><td><code>t"Items.RequiredItemStats"</code></td></tr></tbody></table>

`String` values are stored internally as a null-terminated character array, unfortunately the bytecode doesn't support accessing the individual characters as an array.

`CName` values are stored in-engine as a [64-bit hash key](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function#FNV-1a_hash) to a interned string pool. Class, function and field names are stored in the CName pool, so any methods that need a dynamic reference a scripted component will use a `CName` value.

`ResRef` values are similar to `CName` values, except they specifically refer to archive resource files and presumably use a separate optimized string pool. Unlike `CName`, `ResRef` doesn't have any defined operators.

`TweakDBID` is used as the primary key for all `*_Record` types stored in TweakDB, the engine's internal database.

## Other Types

<table data-header-hidden><thead><tr><th width="139" align="center">Keyword</th><th>Type</th></tr></thead><tbody><tr><td align="center">Keyword</td><td>Type</td></tr><tr><td align="center"><code>Variant</code></td><td>A dynamic type that can store any other type</td></tr></tbody></table>

## Operators

The RED4 scripting runtime implements most operators as native functions. Only the equals `==` and not equals `!=` operators are implemented in bytecode. The **redscript** compiler provides a number of operator symbols as shorthand.

This table lists the available operators (in precedence block order) and what types support them.

<table data-header-hidden><thead><tr><th width="188">Type</th><th align="center">Symbol</th><th align="center">Logical</th><th align="center">Integer</th><th align="center">Float</th><th align="center">String</th><th align="center">CName</th><th align="center">TweakDBID</th></tr></thead><tbody><tr><td>Type</td><td align="center">Symbol</td><td align="center">Logical</td><td align="center">Integer</td><td align="center">Float</td><td align="center">String</td><td align="center">CName</td><td align="center">TweakDBID</td></tr><tr><td>Negate</td><td align="center"><code>-</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Logical Not</td><td align="center"><code>!</code></td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">✓¹</td></tr><tr><td>Bitwise Not</td><td align="center"><code>~</code></td><td align="center">-</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td>Multiplication</td><td align="center"><code>*</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">✓²</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Division</td><td align="center"><code>/</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Modulo</td><td align="center"><code>%</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td>Addition</td><td align="center"><code>+</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">✓³</td><td align="center">✓⁴</td><td align="center">✓⁴</td></tr><tr><td>Subtraction</td><td align="center"><code>-</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td>Less Than</td><td align="center"><code>&#x3C;</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Less Than or Equal</td><td align="center"><code>&#x3C;=</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Greater Than</td><td align="center"><code>></code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Greater Than or Equal</td><td align="center"><code>>=</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td>Equals</td><td align="center"><code>==</code></td><td align="center">✓</td><td align="center">✓</td><td align="center">✓</td><td align="center">✓</td><td align="center">✓⁵</td><td align="center">✓</td></tr><tr><td>Not Equals</td><td align="center"><code>!=</code></td><td align="center">✓</td><td align="center">✓</td><td align="center">✓</td><td align="center">✓</td><td align="center">✓⁵</td><td align="center">✓</td></tr><tr><td></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td>Logical And</td><td align="center"><code>&#x26;&#x26;</code></td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Logical Or</td><td align="center"><code>||</code></td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Bitwise And</td><td align="center"><code>&#x26;</code></td><td align="center">-</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Bitwise Or</td><td align="center"><code>|</code></td><td align="center">-</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Bitwise Xor</td><td align="center"><code>^</code></td><td align="center">-</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td>Assign</td><td align="center"><code>=</code></td><td align="center">✓</td><td align="center">✓</td><td align="center">✓</td><td align="center">✓</td><td align="center">✓</td><td align="center">✓</td></tr><tr><td>Assign Add</td><td align="center"><code>+=</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">✓</td></tr><tr><td>Assign Subtract</td><td align="center"><code>-=</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Assign Multiply</td><td align="center"><code>*=</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Assign Divide</td><td align="center"><code>/=</code></td><td align="center">-</td><td align="center">✓</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Assign Bitwise And</td><td align="center"><code>&#x26;=</code></td><td align="center">-</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr><tr><td>Assign Bitwise Or</td><td align="center"><code>|=</code></td><td align="center">-</td><td align="center">✓</td><td align="center">-</td><td align="center">-</td><td align="center">-</td><td align="center">-</td></tr></tbody></table>

### Notes

1. The Logical Not `!` operator for `TweakDBID` is overridden to return `!TDBID.IsValid(a)`
2. Strings can be multiplied by an `Int32` to repeat the string:

   ```swift
   public static func OperatorMultiply(a: String, count: Int32) -> String
   ```
3. `String` addition is [concatenation](https://en.wikipedia.org/wiki/Concatenation). There are native functions to allow most types can be concatenated with `String`
4. `CName` and `TweakDBID` addition is [concatenation](https://en.wikipedia.org/wiki/Concatenation) (and presumably involves some kind of internal lookup to a known value)
5. The **redscript** compiler doesn't currently support the `==` and `!=` symbols for the `CName` type, use the `Equals(a,b)` and `NotEquals(a,b)` intrinsic functions for now.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.redmodding.org/redscript/language/native-types.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
