---
title: BinaryInteger
framework: swift
role: symbol
role_heading: Protocol
path: swift/binaryinteger
---

# BinaryInteger

An integer type with a binary representation.

## Declaration

```swift
protocol BinaryInteger : CustomStringConvertible, Hashable, Numeric, Strideable where Self.Magnitude : BinaryInteger, Self.Magnitude == Self.Magnitude.Magnitude
```

## Overview

Overview The BinaryInteger protocol is the basis for all the integer types provided by the standard library. All of the standard library’s integer types, such as Int and UInt32, conform to BinaryInteger. Converting Between Numeric Types You can create new instances of a type that conforms to the BinaryInteger protocol from a floating-point number or another binary integer of any type. The BinaryInteger protocol provides initializers for four different kinds of conversion. Range-Checked Conversion You use the default init(_:) initializer to create a new instance when you’re sure that the value passed is representable in the new type. For example, an instance of Int16 can represent the value 500, so the first conversion in the code sample below succeeds. That same value is too large to represent as an Int8 instance, so the second conversion fails, triggering a runtime error. let x: Int = 500 let y = Int16(x) // y == 500

let z = Int8(x) // Error: Not enough bits to represent... When you create a binary integer from a floating-point value using the default initializer, the value is rounded toward zero before the range is checked. In the following example, the value 127.75 is rounded to 127, which is representable by the Int8 type.  128.25 is rounded to 128, which is not representable as an Int8 instance, triggering a runtime error. let e = Int8(127.75) // e == 127

let f = Int8(128.25) // Error: Double value cannot be converted... Exact Conversion Use the init?(exactly:) initializer to create a new instance after checking whether the passed value is representable. Instead of trapping on out-of-range values, using the failable init?(exactly:) initializer results in nil. let x = Int16(exactly: 500) // x == Optional(500)

let y = Int8(exactly: 500) // y == nil When converting floating-point values, the init?(exactly:) initializer checks both that the passed value has no fractional part and that the value is representable in the resulting type. let e = Int8(exactly: 23.0)       // integral value, representable // e == Optional(23)

let f = Int8(exactly: 23.75)      // fractional value, representable // f == nil

let g = Int8(exactly: 500.0)      // integral value, nonrepresentable // g == nil Clamping Conversion Use the init(clamping:) initializer to create a new instance of a binary integer type where out-of-range values are clamped to the representable range of the type. For a type T, the resulting value is in the range T.min...T.max. let x = Int16(clamping: 500) // x == 500

let y = Int8(clamping: 500) // y == 127

let z = UInt8(clamping: -500) // z == 0 Bit Pattern Conversion Use the init(truncatingIfNeeded:) initializer to create a new instance with the same bit pattern as the passed value, extending or truncating the value’s representation as necessary. Note that the value may not be preserved, particularly when converting between signed to unsigned integer types or when the destination type has a smaller bit width than the source type. The following example shows how extending and truncating work for nonnegative integers: let q: Int16 = 850 // q == 0b00000011_01010010

let r = Int8(truncatingIfNeeded: q)      // truncate 'q' to fit in 8 bits // r == 82 //   == 0b01010010

let s = Int16(truncatingIfNeeded: r)     // extend 'r' to fill 16 bits // s == 82 //   == 0b00000000_01010010 Any padding is performed by sign-extending the passed value. When nonnegative integers are extended, the result is padded with zeroes. When negative integers are extended, the result is padded with ones. This example shows several extending conversions of a negative value—note that negative values are sign-extended even when converting to an unsigned type. let t: Int8 = -100 // t == -100 // t's binary representation == 0b10011100

let u = UInt8(truncatingIfNeeded: t) // u == 156 // u's binary representation == 0b10011100

let v = Int16(truncatingIfNeeded: t) // v == -100 // v's binary representation == 0b11111111_10011100

let w = UInt16(truncatingIfNeeded: t) // w == 65436 // w's binary representation == 0b11111111_10011100 Comparing Across Integer Types You can use relational operators, such as the less-than and equal-to operators (< and ==), to compare instances of different binary integer types. The following example compares instances of the Int, UInt, and UInt8 types: let x: Int = -23 let y: UInt = 1_000 let z: UInt8 = 23

if x < y {     print("\(x) is less than \(y).") } // Prints "-23 is less than 1000."

if z > x {     print("\(z) is greater than \(x).") } // Prints "23 is greater than -23."

## Topics

### Creating a Binary Integer

- [init()](swift/binaryinteger/init().md)

### Converting Integers

- [init(_:)](swift/binaryinteger/init(_:)-8gmdl.md)
- [init(clamping:)](swift/binaryinteger/init(clamping:).md)
- [init(truncatingIfNeeded:)](swift/binaryinteger/init(truncatingifneeded:).md)

### Converting Floating-Point Values

- [init(_:)](swift/binaryinteger/init(_:)-2ln0u.md)

### Converting with No Loss of Precision

- [init(exactly:)](swift/binaryinteger/init(exactly:).md)

### Performing Calculations

- [Binary Integer Operators](swift/binary-integer-operators.md)
- [quotientAndRemainder(dividingBy:)](swift/binaryinteger/quotientandremainder(dividingby:).md)
- [isMultiple(of:)](swift/binaryinteger/ismultiple(of:).md)

### Finding the Sign and Magnitude

- [signum()](swift/binaryinteger/signum().md)

### Accessing Numeric Constants

- [isSigned](swift/binaryinteger/issigned.md)

### Working with Binary Representation

- [bitWidth](swift/binaryinteger/bitwidth.md)
- [trailingZeroBitCount](swift/binaryinteger/trailingzerobitcount.md)
- [words](swift/binaryinteger/words-swift.property.md)
- [Words](swift/binaryinteger/words-swift.associatedtype.md)

### Operators

- [%(_:_:)](swift/binaryinteger/_(_:_:)-30ngi.md)
- [^(_:_:)](swift/binaryinteger/_(_:_:)-3qw5d.md)
- [|(_:_:)](swift/binaryinteger/_(_:_:)-6qhsw.md)
- [^=(_:_:)](swift/binaryinteger/_=(_:_:)-1fatv.md)
- [|=(_:_:)](swift/binaryinteger/_=(_:_:)-4vfmj.md)
- [%=(_:_:)](swift/binaryinteger/_=(_:_:)-79wgi.md)
- [<<(_:_:)](swift/binaryinteger/__(_:_:)-28lmu.md)
- [>>(_:_:)](swift/binaryinteger/__(_:_:)-4vnij.md)
- [>>=(_:_:)](swift/binaryinteger/__=(_:_:)-5lhky.md)
- [<<=(_:_:)](swift/binaryinteger/__=(_:_:)-9pzpp.md)

### Initializers

- [init(_:format:lenient:)](swift/binaryinteger/init(_:format:lenient:)-2qv61.md)
- [init(_:format:lenient:)](swift/binaryinteger/init(_:format:lenient:)-50z9r.md)
- [init(_:format:lenient:)](swift/binaryinteger/init(_:format:lenient:)-86j1g.md)
- [init(_:strategy:)](swift/binaryinteger/init(_:strategy:)-207i8.md)

### Instance Methods

- [formatted()](swift/binaryinteger/formatted().md)
- [formatted(_:)](swift/binaryinteger/formatted(_:)-4qd73.md)
- [formatted(_:)](swift/binaryinteger/formatted(_:)-73k3e.md)

### Default Implementations

- [BinaryInteger Implementations](swift/binaryinteger/binaryinteger-implementations.md)
- [Equatable Implementations](swift/binaryinteger/equatable-implementations.md)

## Relationships

### Inherits From

- [AdditiveArithmetic](swift/additivearithmetic.md)
- [Comparable](swift/comparable.md)
- [CustomStringConvertible](swift/customstringconvertible.md)
- [Equatable](swift/equatable.md)
- [ExpressibleByIntegerLiteral](swift/expressiblebyintegerliteral.md)
- [Hashable](swift/hashable.md)
- [Numeric](swift/numeric.md)
- [Strideable](swift/strideable.md)

### Inherited By

- [FixedWidthInteger](swift/fixedwidthinteger.md)
- [SignedInteger](swift/signedinteger.md)
- [UnsignedInteger](swift/unsignedinteger.md)

### Conforming Types

- [Int](swift/int.md)
- [Int128](swift/int128.md)
- [Int16](swift/int16.md)
- [Int32](swift/int32.md)
- [Int64](swift/int64.md)
- [Int8](swift/int8.md)
- [UInt](swift/uint.md)
- [UInt128](swift/uint128.md)
- [UInt16](swift/uint16.md)
- [UInt32](swift/uint32.md)
- [UInt64](swift/uint64.md)
- [UInt8](swift/uint8.md)

## See Also

### Integer

- [FixedWidthInteger](swift/fixedwidthinteger.md)
- [SignedInteger](swift/signedinteger.md)
- [UnsignedInteger](swift/unsignedinteger.md)
