silk.num.u8.
Eight-bit unsigned integers for bytes, compact counters, and exact binary representations.
When to use#
Use u8 for an individual byte or a field specified as eight unsigned bits. Prefer a wider
integer for general counting unless the 0 through 255 range is intentional.
Details#
Each arithmetic operation has four forms with different overflow rules:
The plain form, such as
add, traps on overflow. Use it when overflow is a program error.The
checkedform, such ascheckedAdd, returnsNoneon overflow. Use it when input data controls the operands.The
wrappingform, such aswrappingAdd, computes the result modulo 2^8.The
saturatingform, such assaturatingAdd, returnsMINorMAXon overflow.
Division and remainder by zero trap. checkedDivide and checkedRemainder return None.
The shift count must be in the range 0 to BITS - 1. Otherwise, the program traps. A rotate
reduces its count modulo BITS, so each count is valid. A right shift inserts zero bits.
A to conversion, such as toU8, traps if the value is out of the range of the destination
type. A checkedTo conversion returns None instead. Conversion to f32 or f64 is exact.
A wrappingTo conversion, such as wrappingToI16, never traps. It keeps the low bits of the
two's complement form of the value, like a cast in C or Rust, so it truncates, sign-extends, or
reinterprets bits.
countOnes, leadingZeros, and trailingZeros count the bits of the value. For
zero, both zero counts return BITS.
parse reads decimal text. A sign is not valid. To write a value as text, use
silk.text.format.Format.display or Format.displayWith with a Writer. Neither needs an
Allocator.
Examples#
Choose an overflow policy instead of relying on a trap#
import silk.core.option { Option }
import silk.num.u8
pub fn main() -> i32 {
let checked = u8.checkedAdd(255, 1)
let recovered = move checked |> Option<u8>.unwrapOr(42)
if recovered != 42 {
return 1
}
if u8.wrappingAdd(255, 1) != 0 {
return 1
}
if u8.saturatingAdd(255, 1) != 255 {
return 1
}
return 0
}Parse decimal text and reject invalid text#
import silk.text.format { ParseError }
import silk.core.result { Result }
import silk.num.u8
pub fn main() -> i32 {
let parsed = u8.parse("42") |> Result<u8, ParseError>.unwrapOr(0)
let invalid = u8.parse("4x2") |> Result<u8, ParseError>.unwrapOr(0)
if parsed != 42 || invalid != 0 {
return 1
}
return 0
}See also#
Use the silk.text.char module when a value is a Unicode scalar rather than an arbitrary byte.
Import as u8 with import silk.num.u8.
Public declarations: 70.
MAX#
pub const MAX: u8The largest u8 value.
MIN#
pub const MIN: u8The smallest u8 value.
BITS#
pub const BITS: u32The fixed width of u8, in bits.
toU8#
pub fn toU8(value: u8) -> u8Returns value unchanged as u8. Use this function when generic conversion code
can select u8 as both source and destination.
checkedToU8#
pub fn checkedToU8(value: u8) -> Option<u8>Returns Some with value unchanged as u8. Use this function when generic
checked-conversion code can select the same source and destination type.
toU16#
pub fn toU16(value: u8) -> u16Converts value exactly to u16. Every u8 value is representable.
checkedToU16#
pub fn checkedToU16(value: u8) -> Option<u16>Converts value exactly to u16 and returns Some. Every u8 value is
representable.
toU32#
pub fn toU32(value: u8) -> u32Converts value exactly to u32. Every u8 value is representable.
checkedToU32#
pub fn checkedToU32(value: u8) -> Option<u32>Converts value exactly to u32 and returns Some. Every u8 value is
representable.
toU64#
pub fn toU64(value: u8) -> u64Converts value exactly to u64. Every u8 value is representable.
checkedToU64#
pub fn checkedToU64(value: u8) -> Option<u64>Converts value exactly to u64 and returns Some. Every u8 value is
representable.
toUsize#
pub fn toUsize(value: u8) -> usizeConverts value exactly to usize. Every u8 value is representable.
checkedToUsize#
pub fn checkedToUsize(value: u8) -> Option<usize>Converts value exactly to usize and returns Some. Every u8 value is
representable.
toI8#
pub fn toI8(value: u8) -> i8Converts value to i8. Traps if value is outside the i8 range. Use
this function when an out-of-range value is a program error.
checkedToI8#
pub fn checkedToI8(value: u8) -> Option<i8>Converts value to i8, or returns None if value is outside the i8
range. Use this function when an out-of-range value is input data.
toI16#
pub fn toI16(value: u8) -> i16Converts value exactly to i16. Every u8 value is representable.
checkedToI16#
pub fn checkedToI16(value: u8) -> Option<i16>Converts value exactly to i16 and returns Some. Every u8 value is
representable.
toI32#
pub fn toI32(value: u8) -> i32Converts value exactly to i32. Every u8 value is representable.
checkedToI32#
pub fn checkedToI32(value: u8) -> Option<i32>Converts value exactly to i32 and returns Some. Every u8 value is
representable.
toI64#
pub fn toI64(value: u8) -> i64Converts value exactly to i64. Every u8 value is representable.
checkedToI64#
pub fn checkedToI64(value: u8) -> Option<i64>Converts value exactly to i64 and returns Some. Every u8 value is
representable.
toIsize#
pub fn toIsize(value: u8) -> isizeConverts value exactly to isize. Every u8 value is representable.
checkedToIsize#
pub fn checkedToIsize(value: u8) -> Option<isize>Converts value exactly to isize and returns Some. Every u8 value is
representable.
toF32#
pub fn toF32(value: u8) -> f32Converts value exactly to f32. Every u8 value is below 2^24 and so is exactly
representable.
toF64#
pub fn toF64(value: u8) -> f64Converts value exactly to f64. Every u8 value is below 2^53 and so is exactly
representable.
wrappingToU8#
pub fn wrappingToU8(value: u8) -> u8Returns value unchanged. Use this function when generic wrapping-conversion code
can select u8 as both source and destination.
wrappingToU16#
pub fn wrappingToU16(value: u8) -> u16Converts value to u16 modulo 2^16. Keeps the low 16 bits of the two's complement
form of value and reads them as u16, so it never traps. Use this function for deliberate
truncation, sign extension, or bit reinterpretation, such as reading a signed field.
wrappingToU32#
pub fn wrappingToU32(value: u8) -> u32Converts value to u32 modulo 2^32. Keeps the low 32 bits of the two's complement
form of value and reads them as u32, so it never traps. Use this function for deliberate
truncation, sign extension, or bit reinterpretation, such as reading a signed field.
wrappingToU64#
pub fn wrappingToU64(value: u8) -> u64Converts value to u64 modulo 2^64. Keeps the low 64 bits of the two's complement
form of value and reads them as u64, so it never traps. Use this function for deliberate
truncation, sign extension, or bit reinterpretation, such as reading a signed field.
wrappingToUsize#
pub fn wrappingToUsize(value: u8) -> usizeConverts value to usize modulo 2^usize.BITS. Keeps the low usize.BITS bits of the two's
complement form of value and reads them as usize, so it never traps. Use this function for
deliberate truncation, sign extension, or bit reinterpretation, such as reading a signed field.
wrappingToI8#
pub fn wrappingToI8(value: u8) -> i8Converts value to i8 modulo 2^8. Keeps the low 8 bits of the two's complement
form of value and reads them as i8, so it never traps. Use this function for deliberate
truncation, sign extension, or bit reinterpretation, such as reading a signed field.
wrappingToI16#
pub fn wrappingToI16(value: u8) -> i16Converts value to i16 modulo 2^16. Keeps the low 16 bits of the two's complement
form of value and reads them as i16, so it never traps. Use this function for deliberate
truncation, sign extension, or bit reinterpretation, such as reading a signed field.
wrappingToI32#
pub fn wrappingToI32(value: u8) -> i32Converts value to i32 modulo 2^32. Keeps the low 32 bits of the two's complement
form of value and reads them as i32, so it never traps. Use this function for deliberate
truncation, sign extension, or bit reinterpretation, such as reading a signed field.
wrappingToI64#
pub fn wrappingToI64(value: u8) -> i64Converts value to i64 modulo 2^64. Keeps the low 64 bits of the two's complement
form of value and reads them as i64, so it never traps. Use this function for deliberate
truncation, sign extension, or bit reinterpretation, such as reading a signed field.
wrappingToIsize#
pub fn wrappingToIsize(value: u8) -> isizeConverts value to isize modulo 2^isize.BITS. Keeps the low isize.BITS bits of the two's
complement form of value and reads them as isize, so it never traps. Use this function for
deliberate truncation, sign extension, or bit reinterpretation, such as reading a signed field.
add#
pub fn add(left: u8, right: u8) -> u8Returns left + right and traps if the result is outside the u8 range. Use this function
when overflow is a program error.
subtract#
pub fn subtract(left: u8, right: u8) -> u8Returns left - right and traps if the result is outside the u8 range. Use this function
when overflow is a program error.
multiply#
pub fn multiply(left: u8, right: u8) -> u8Returns left * right and traps if the result is outside the u8 range. Use this function
when overflow is a program error.
divide#
pub fn divide(left: u8, right: u8) -> u8Returns left / right. Traps if right is zero. Use this function when a zero
divisor is a program error.
remainder#
pub fn remainder(left: u8, right: u8) -> u8Returns the remainder of left / right. Traps if right is zero. Use this function
when a zero divisor is a program error.
bitAnd#
pub fn bitAnd(left: u8, right: u8) -> u8Returns the bitwise AND of left and right.
bitOr#
pub fn bitOr(left: u8, right: u8) -> u8Returns the bitwise OR of left and right.
bitXor#
pub fn bitXor(left: u8, right: u8) -> u8Returns the bitwise exclusive OR of left and right.
bitNot#
pub fn bitNot(value: u8) -> u8Returns value with each bit inverted.
shiftLeft#
pub fn shiftLeft(left: u8, right: u8) -> u8Shifts left bits left by right positions. Traps if right is not less than BITS.
shiftRight#
pub fn shiftRight(left: u8, right: u8) -> u8Shifts left bits right by right positions and inserts zero bits. Traps if right is
not less than BITS.
rotateLeft#
pub fn rotateLeft(left: u8, right: u8) -> u8Rotates the bits of left left by right positions. The count is reduced modulo BITS, so
each count is valid.
rotateRight#
pub fn rotateRight(left: u8, right: u8) -> u8Rotates the bits of left right by right positions. The count is reduced modulo BITS, so
each count is valid.
countOnes#
pub fn countOnes(value: u8) -> u32Returns the number of one bits in value.
leadingZeros#
pub fn leadingZeros(value: u8) -> u32Returns the number of zero bits above the highest one bit of value. Returns BITS for
zero.
trailingZeros#
pub fn trailingZeros(value: u8) -> u32Returns the number of zero bits below the lowest one bit of value. Returns BITS for zero.
wrappingAdd#
pub fn wrappingAdd(left: u8, right: u8) -> u8Returns left + right, wrapped to the u8 range. Use this function for
deliberate modulo arithmetic.
wrappingSubtract#
pub fn wrappingSubtract(left: u8, right: u8) -> u8Returns left - right, wrapped to the u8 range. Use this function for
deliberate modulo arithmetic.
wrappingMultiply#
pub fn wrappingMultiply(left: u8, right: u8) -> u8Returns left * right, wrapped to the u8 range. Use this function for
deliberate modulo arithmetic.
saturatingAdd#
pub fn saturatingAdd(left: u8, right: u8) -> u8Returns left + right, clamped to MIN or MAX. Use this function when a
boundary value is the required overflow result.
saturatingSubtract#
pub fn saturatingSubtract(left: u8, right: u8) -> u8Returns left - right, clamped to MIN or MAX. Use this function when a
boundary value is the required overflow result.
saturatingMultiply#
pub fn saturatingMultiply(left: u8, right: u8) -> u8Returns left * right, clamped to MIN or MAX. Use this function when a
boundary value is the required overflow result.
multiplyHigh#
pub fn multiplyHigh(left: u8, right: u8) -> u8Returns the high 8 bits of the exact 16-bit product left * right. It never overflows.
When to use#
Use this function with wrappingMultiply, which returns the low 8 bits, when an algorithm
needs the full product, such as multi-word arithmetic, multiply-shift hashing, or division by
a precomputed reciprocal.
checkedAdd#
pub fn checkedAdd(left: u8, right: u8) -> Option<u8>Returns Some with left + right, or None if the result is outside the u8 range.
Use this function when overflow is input data.
checkedSubtract#
pub fn checkedSubtract(left: u8, right: u8) -> Option<u8>Returns Some with left - right, or None if the result is outside the u8 range.
Use this function when overflow is input data.
checkedMultiply#
pub fn checkedMultiply(left: u8, right: u8) -> Option<u8>Returns Some with left * right, or None if the result is outside the u8 range.
Use this function when overflow is input data.
checkedDivide#
pub fn checkedDivide(left: u8, right: u8) -> Option<u8>Returns Some with left / right, or None if right is zero. Use this
function when a zero divisor is input data.
checkedRemainder#
pub fn checkedRemainder(left: u8, right: u8) -> Option<u8>Returns Some with the remainder, or None if right is zero. Use this function
when a zero divisor is input data.
equals#
pub fn equals(left: u8, right: u8) -> boolReturns true if left and right are equal.
notEquals#
pub fn notEquals(left: u8, right: u8) -> boolReturns true if left and right are not equal.
lessThan#
pub fn lessThan(left: u8, right: u8) -> boolReturns true if left is less than right.
lessOrEqual#
pub fn lessOrEqual(left: u8, right: u8) -> boolReturns true if left is less than or equal to right.
greaterThan#
pub fn greaterThan(left: u8, right: u8) -> boolReturns true if left is greater than right.
greaterOrEqual#
pub fn greaterOrEqual(left: u8, right: u8) -> boolReturns true if left is greater than or equal to right.
parse#
pub fn parse(text: string) -> Result<u8, ParseError>Returns the u8 value of the decimal text text, or a ParseError.
Details#
The complete text must be one decimal number. This function does not skip spaces and does not accept digit separators.
Errors#
ParseErrorwith reasonsilk.text.format.NotANumberiftextis empty, has a sign, contains a byte that is not a digit, or has bytes after the number.offsetgives the byte position where the read stopped.ParseErrorwith reasonsilk.text.format.OutOfRangeif the number is outside the range ofu8.
Category: Numbers.
Profiles: aarch64-apple-darwin, aarch64-unknown-linux-gnu, aarch64-unknown-linux-gnu-no-libc, x86_64-unknown-linux-gnu, x86_64-unknown-linux-gnu-no-libc, wasm32-unknown-unknown, wasm32-wasip1, wasm32-wasip2.