LINUX.ORG.RU

История изменений

Исправление wandrien, (текущая версия) :

Планирую такую систему типов. Пока набросок.

Целые типы

  • uint8, uint16, uint32, uint64 и т.п. — целые без знака. Значение результата при переполнении не является UB. (Ну это везде так.)
  • int8, int16, int32, int64 и т.п. — целые со знаком в дополнительном коде. Значение результата при переполнении не является UB. (В отличие от Си.)

Целые типы могут быть любой сколь угодно большой разрядности. Для чисел большой разрядности компилятор автоматически подставляет вызовы библиотечных функций, реализующих соответствующую арифметику.

Типы могут идти со следующими префиксами:

  • checked — компилятор вставляет код для проверки результатов арифметических операций, и если результат не может быть представлен без переполнения, выполняет вызов abort(). Специальная конструкция языка будет предназначена для ветвления по условию переполнения при вычислении выражения вместо вызова abort(). (Т.е. в одну ветку коду управление попадает при отсутствии переполнения, в другую при наличии.)
  • wrapped — в случае переполнения старшие биты просто отбрасываются.
  • saturating — в случае переполнения результат заменяется на соответствующее минимальное или максимальное значение типа.
  • safe — отдельное числовое значение (0xFFF... для беззнаковых и 0x800... для знаковых) представляет значение NaN. Переполнение порождает результат NaN. Любая арифметическая операция с использованием NaN также порождает NaN.

Автоматические приведения числовых типов возможны только для тех типов, где весь диапазон значений исходного типа может быть представлен в целевом типе.

Явное приведение типов возможно между любыми числовыми типами, но следует логике соответствующего целевого типа. (Для checked переполнение при приведении типа вызывает abort(), для wrapped биты просто обрезаются и т.п.)

При отсутствии одного из указанных префиксов компилятор использует префикс, указанный в опциях компиляции. Допустимы только варианты: checked и wrapped.

Синонимы целых типов

Синонимы типов, завязанные на особенности реализации:

  • sys.word, sys.iword — целые без знака и со знаком, соответствующие натуральному размеру регистров машины. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.smallword, sys.ismallword — целые без знака и со знаком, имеющие разрядность в половину sys.word, sys.iword, в случае, если архитектура машины предоставляет эффективные инструкции для арифметики такого размера. В ином случае эквивалентны sys.word, sys.iword. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.longword, sys.ilongword — целые без знака и со знаком, имеющие разрядность в два раза больше sys.word, sys.iword, либо равные им, в зависимости от настроек компилятора для конкретной архитектуры. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.storage_size — целое без знака, достаточное для хранения максимального размера объекта в оперативной памяти.
  • sys.storage_offset — целое со знаком, достаточное для хранения разности указателей.

Далее:

  • char, char16, char32 — типы, предназначенные для хранения соответственно 8-битных символов, 16-битных код-пойнтов UCS-2 и 32-битных код-пойнтов UCS-4. Автоматические касты этих типов в другие численные типы (и обратно) запрещены, но они могут быть сконвертированны явным приведением типа.

Типы с фиксированной точкой

  • fixedN.M и ufixedN.M — соответственно знаковый и беззнаковый тип с фиксированной точкой. Число N задаёт общую разрядности типа (включая бит знака), а число M — количество бит после двоичной точки. Например fixed32.8 — число со знаком общей разрядностью 32 бита, из которых 8 бит приходятся на дробную часть.

В том числе, число M может быть больше N, что означает, что двоичная точка уезжает влево за пределы разрядной сетки типа.

По необходимости компилятор автоматически вставляет вызовы библиотечных функций для работы с этими типами.

Также как и целые, типы с фиксированной точкой могут быть checked, wrapped, saturating и safe.

Типы с плавающей точкой

  • Гарантируются только следующие стандартные типы: float32, float64.
  • float — по умолчанию синоним для float64. Разрядность типа может быть переопределена вручную через опции компилятора.

Исправление wandrien, :

Планирую такую систему типов. Пока набросок.

Целые типы

  • uint8, uint16, uint32, uint64 и т.п. — целые без знака. Значение результата при переполнении не является UB. (Ну это везде так.)
  • int8, int16, int32, int64 и т.п. — целые со знаком в дополнительном коде. Значение результата при переполнении не является UB. (В отличие от Си.)

Целые типы могут быть любой сколь угодно большой разрядности. Для чисел большой разрядности компилятор автоматически подставляет вызовы библиотечных функций, реализующих соответствующую арифметику.

Типы могут идти со следующими префиксами:

  • checked — компилятор вставляет код для проверки результатов арифметических операций, и если результат не может быть представлен без переполнения, выполняет вызов abort(). Специальная конструкция языка будет предназначена для ветвления по условию переполнения при вычислении выражения вместо вызова abort(). (Т.е. в одну ветку коду управление попадает при отсутствии переполнения, в другую при наличии.)
  • wrapped — в случае переполнения старшие биты просто отбрасываются.
  • saturating — в случае переполнения результат заменяется на соответствующее минимальное или максимальное значение типа.
  • safe — отдельное числовое значение (0xFFF... для беззнаковых и 0x800... для знаковых) представляет значение NaN. Переполнение порождает результат NaN. Любая арифметическая операция с использованием NaN также порождает NaN.

Автоматические приведения числовых типов возможны только для тех типов, где весь диапазон значений исходного типа может быть представлен в целевом типе.

Явное приведение типов возможно между любыми числовыми типами, но следует логике соответствующего целевого типа. (Для checked переполнение при приведении типа вызывает abort(), для wrapped биты просто обрезаются и т.п.)

При отсутствии одного из указанных префиксов компилятор использует префикс, указанный в опциях компиляции. Допустимы только варианты: checked и wrapped.

Синонимы целых типов

Синонимы типов, завязанные на особенности реализации:

  • sys.word, sys.iword — целые без знака и со знаком, соответствующие натуральному размеру регистров машины. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.smallword, sys.ismallword — целые без знака и со знаком, имеющие разрядность в половину sys.word, sys.iword, в случае, если архитектура машины предоставляет эффективные инструкции для арифметики такого размера. В ином случае эквивалентны sys.word, sys.iword. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.longword, sys.ilongword — целые без знака и со знаком, имеющие разрядность в два раза больше sys.word, sys.iword, либо равные им, в зависимости от настроек компилятора для конкретной архитектуры. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.storage_size — целое без знака, достаточное для хранения максимального размера объекта в оперативной памяти.
  • sys.storage_offset — целое со знаком, достаточное для хранения разности указателей.

Далее:

  • char, char16, char32 — типы, предназначенные для хранения соответственно 8-битных символов, 16-битных код-пойнтов UCS-2 и 32-битных код-пойнтов UCS-4. Автоматические касты этих типов в другие численные типы (и обратно) запрещены, но они могут быть сконвертированны явным приведением типа.

Типы с фиксированной точкой

  • fixedN.M и ufixedN.M — соответственно знаковый и беззнаковый тип с фиксированной точкой. Число N задаёт общую разрядности типа (включая бит знака), а число M — количество бит после двоичной точки. Например fixed32.8 — число со знаком общей разроядностью 32 бита, из которых 8 бит приходятся на дробную часть.

В том числе, число M может быть больше N, что означает, что двоичная точка уезжает влево за пределы разрядной сетки типа.

По необходимости компилятор автоматически вставляет вызовы библиотечных функций для работы с этими типами.

Также как и целые, типы с фиксированной точкой могут быть checked, wrapped, saturating и safe.

Типы с плавающей точкой

  • Гарантируются только следующие стандартные типы: float32, float64.
  • float — по умолчанию синоним для float64. Разрядность типа может быть переопределена вручную через опции компилятора.

Исправление wandrien, :

Планирую такую систему типов. Пока набросок.

Целые типы

  • uint8, uint16, uint32, uint64 и т.п. — целые без знака. Значение результата при переполнении не является UB. (Ну это везде так.)
  • int8, int16, int32, int64 и т.п. — целые со знаком в дополнительном коде. Значение результата при переполнении не является UB. (В отличие от Си.)

Целые типы могут быть любой сколь угодно большой разрядности. Для чисел большой разрядности компилятор автоматически подставляет вызовы библиотечных функций, реализующих соответствующую арифметику.

Типы могут идти со следующими префиксами:

  • checked — компилятор вставляет код для проверки результатов арифметических операций, и если результат не может быть представлен без переполнения, выполняет вызов abort(). Специальная конструкция языка будет предназначена для ветвления по условию переполнения при вычислении выражения вместо вызова abort(). (Т.е. в одну ветку коду управление попадает при отсутствии переполнения, в другую при наличии.)
  • wrapped — в случае переполнения старшие биты просто отбрасываются.
  • saturating — в случае переполнения результат заменяется на соответствующее минимальное или максимальное значение типа.
  • safe — отдельное числовое значение (0xFFF... для беззнаковых и 0x800... для знаковых) представляет значение NaN. Переполнение порождает результат NaN. Любая арифметическая операция с использованием NaN также порождает NaN.

Автоматические приведения числовых типов возможны только для тех типов, где весь диапазон значений исходного типа может быть представлен в целевом типе.

Явное приведение типов возможно между любыми числовыми типами, но следует логике соответствующего целевого типа. (Для checked переполнение при приведении типа вызывает abort(), для wrapped биты просто обрезаются и т.п.)

При отсутствии одного из указанных префиксов компилятор использует префикс, указанный в опциях компиляции. Допустимы только варианты: checked и wrapped.

Синонимы целых типов

Синонимы типов, завязанные на особенности реализации:

  • sys.word, sys.iword — целые без знака и со знаком, соответствующие натуральному размеру регистров машины. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.smallword, sys.smallword — целые без знака и со знаком, имеющие разрядность в половину sys.word, sys.iword, в случае, если архитектура машины предоставляет эффективные инструкции для арифметики такого размера. В ином случае эквивалентны sys.word, sys.iword. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.longword, sys.ilongword — целые без знака и со знаком, имеющие разрядность в два раза больше sys.word, sys.iword, либо равные им, в зависимости от настроек компилятора для конкретной архитектуры. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.storage_size — целое без знака, достаточное для хранения максимального размера объекта в оперативной памяти.
  • sys.storage_offset — целое со знаком, достаточное для хранения разности указателей.

Далее:

  • char, char16, char32 — типы, предназначенные для хранения соответственно 8-битных символов, 16-битных код-пойнтов UCS-2 и 32-битных код-пойнтов UCS-4. Автоматические касты этих типов в другие численные типы (и обратно) запрещены, но они могут быть сконвертированны явным приведением типа.

Типы с фиксированной точкой

  • fixedN.M и ufixedN.M — соответственно знаковый и беззнаковый тип с фиксированной точкой. Число N задаёт общую разрядности типа (включая бит знака), а число M — количество бит после двоичной точки. Например fixed32.8 — число со знаком общей разроядностью 32 бита, из которых 8 бит приходятся на дробную часть.

В том числе, число M может быть больше N, что означает, что двоичная точка уезжает влево за пределы разрядной сетки типа.

По необходимости компилятор автоматически вставляет вызовы библиотечных функций для работы с этими типами.

Также как и целые, типы с фиксированной точкой могут быть checked, wrapped, saturating и safe.

Типы с плавающей точкой

  • Гарантируются только следующие стандартные типы: float32, float64.
  • float — по умолчанию синоним для float64. Разрядность типа может быть переопределена вручную через опции компилятора.

Исправление wandrien, :

Планирую такую систему типов. Пока набросок.

Целые типы

  • uint8, uint16, uint32, uint64 и т.п. — целые без знака. Значение результата при переполнении не является UB. (Ну это везде так.)
  • int8, int16, int32, int64 и т.п. — целые со знаком в дополнительном коде. Значение результата при переполнении не является UB. (В отличие от Си.)

Целые типы могут быть любой сколь угодно большой разрядности. Для чисел большой разрядности компилятор автоматически подставляет вызовы библиотечных функций, реализующих соответствующую арифметику.

Типы могут идти со следующими префиксами:

  • checked — компилятор вставляет код для проверки результатов арифметических операций, и если результат не может быть представлен без переполнения, выполняет вызов abort(). Специальная конструкция языка будет предназначена для ветвления по условию переполнения при вычислении выражения вместо вызова abort(). (Т.е. в одну ветку коду управление попадает при отсутствии переполнения, в другую при наличии.)
  • wrapped — в случае переполнения старшие биты просто отбрасываются.
  • saturating — в случае переполнения результат заменяется на соответствующее минимальное или максимальное значение типа.
  • safe — отдельное числовое значение (0xFFF... для беззнаковых и 0x800... для знаковых) представляет значение NaN. Переполнение порождает результат NaN. Любая арифметическая операция с использованием NaN также порождает NaN.

Автоматические приведения числовых типов возможны только для тех типов, где весь диапазон значений исходного типа может быть представлен в целевом типе.

Явное приведение типов возможно между любыми числовыми типами, но следует логике соответствующего целевого типа. (Для checked переполнение при приведении типа вызывает abort(), для wrapped биты просто обрезаются и т.п.)

При отсутствии одного из указанных префиксов компилятор использует префикс, указанный в опциях компиляции. Допустимы только варианты: checked и wrapped.

Синонимы целых типов

Синонимы типов, завязанные на особенности реализации:

  • sys.word, sys.iword — целые без знака и со знаком, соответствующие натуральному размеру регистров машины. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.smallword, sys.smallword — целые без знака и со знаком, имеющие разрядность в половину sys.word, sys.iword, в случае, если архитектура машины предоставляет эффективные инструкции для арифметики такого размера. В ином случае эквивалентны sys.word, sys.iword. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.longword, sys.ilongword — целые без знака и со знаком, имеющие разрядность в два раза больше sys.word, sys.iword, либо равные им, в зависимости от настроек компилятора для конкретной архитектуры. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.storage_size — целое без знака, достаточное для хранения максимального размера объекта в оперативной памяти.
  • sys.storage_offset — целое со знаком, достаточное для хранения разности указателей.

Далее:

  • char, char16, char32 — типы, предназначенные для хранения соответственно 8-битных символов, 16-битных код-пойнтов UCS-2 и 32-битных код-пойнтов UCS-4. Автоматические касты этих типов в другие численные типы (и обратно) запрещены, но они могут быть сконвертированны явным приведением типа.

Типы с фиксированной точкой

  • fixedN.M и ufixedN.M — соответственно знаковый и беззнаковый тип с фиксированной точкой. Число N задаёт общую разрядности типа (включая бит знака), а число M — количество бит после двоичной точки. Например fixed32.8 — число со знаком общей разроядностью 32 бита, из которых 8 бит приходятся на дробную часть.

В том числе, число M может быть больше N, что означает, что двоичная точка уезжает влево за пределы разрядной сетки типа.

По необходимости компилятор автоматически вставляет вызовы библиотечных функций для работы с этими типами.

Также как и целые, типы с фиксированной точкой могут быть checked, wrapped, saturating и safe.

Типы с плавающей точкой

  • Гарантируются только следующие стандартные типы: float32, float64.
  • float — по умолчанию синоним для `float64. Разрядность типа может быть переопределена вручную через опции компилятора.

Исправление wandrien, :

Планирую такую систему типов. Пока набросок.

Целые типы

  • uint8, uint16, uint32, uint64 и т.п. — целые без знака. Значение результата при переполнении не является UB. (Ну это везде так.)
  • int8, int16, int32, int64 и т.п. — целые со знаком в дополнительном коде. Значение результата при переполнении не является UB. (В отличие от Си.)

Целые типы могут быть любой сколь угодно большой разрядности. Для чисел большой разрядности компилятор автоматически подставляет вызовы библиотечных функций, реализующих соответствующую арифметику.

Типы могут идти со следующими префиксами:

  • checked — компилятор вставляет код для проверки результатов арифметических операций, и если результат не может быть представлен без переполнения, выполняет вызов abort(). Специальная конструкция языка будет предназначена для ветвления по условию переполнения при вычислении выражения вместо вызова abort(). (Т.е. в одну ветку коду управление попадает при отсутствии переполнения, в другую при наличии.)
  • wrapped — в случае переполнения старшие биты просто отбрасываются.
  • saturating — в случае переполнения результат заменяется на соответствующее минимальное или максимальное значение типа.
  • safe — отдельное числовое значение (0xFFF... для беззнаковых и 0x800... для знаковых) представляет значение NaN. Переполнение порождает результат NaN. Любая арифметическая операция с использованием NaN также порождает NaN.

Автоматические приведения числовых типов возможны только для тех типов, где весь диапазон значений исходного типа может быть представлен в целевом типе.

Явное приведение типов возможно между любыми числовыми типами, но следует логике соответствующего целевого типа. (Для checked переполнение при приведении типа вызывает abort(), для wrapped биты просто обрезаются и т.п.)

При отсутствии одного из указанных префиксов компилятор использует префикс, указанный в опциях компиляции. Допустимы только варианты: checked и wrapped.

Синонимы целых типов

Синонимы типов, завязанные на особенности реализации:

  • sys.word, sys.iword — целые без знака и со знаком, соответствующие натуральному размеру регистров машины. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.smallword, sys.smallword — целые без знака и со знаком, имеющие разрядность в половину sys.word, sys.iword, в случае, если архитектура машины предоставляет эффективные инструкции для арифметики такого размера. В ином случае эквивалентны sys.word, sys.iword. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.longword, sys.ilongword — целые без знака и со знаком, имеющие разрядность в два раза больше sys.word, sys.iword, либо равные им, в зависимости от настроек компилятора для конкретной архитектуры. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.storage_size — целое без знака, достаточное для хранения максимального размера объекта в оперативной памяти.
  • sys.storage_offset — целое со знаком, достаточное для хранения разности указателей.

Далее:

  • char, char16, char32 — типы, предназначенные для хранения соответственно 8-битных символов, 16-битных код-пойнтов UCS-2 и 32-битных код-пойнтов UCS-4. Автоматические касты этих типов в другие численные типы (и обратно) запрещены, но они могут быть сконвертированны явным приведением типа.

Типы с фиксированной точкой

  • fixedN.M и ufixedN.M — соответственно знаковый и беззнаковый тип с фиксированной точкой. Число N задаёт общую разрядности типа (включая бит знака), а число M — количество бит после двоичной точки. Например fixed32.8 — число со знаком общей разроядностью 32 бита, из которых 8 бит приходятся на дробную часть.

По необходимости компилятор автоматически вставляет вызовы библиотечных функций для работы с этими типами.

Также как и целые, типы с фиксированной точкой могут быть checked, wrapped, saturating и safe.

Типы с плавающей точкой

  • Гарантируются только следующие стандартные типы: float32, float64.
  • float — по умолчанию синоним для `float64. Разрядность типа может быть переопределена вручную через опции компилятора.

Исправление wandrien, :

Планирую такую систему типов. Пока набросок.

Целые типы

  • uint8, uint16, uint32, uint64 и т.п. — целые без знака. Значение результата при переполнении не является UB. (Ну это везде так.)
  • int8, int16, int32, int64 и т.п. — целые со знаком в дополнительном коде. Значение результата при переполнении не является UB. (В отличие от Си.)

Целые типы могут быть любой сколь угодно большой разрядности. Для чисел большой разрядности компилятор автоматически подставляет вызовы библиотечных функций, реализующих соответствующую арифметику.

Типы могут идти со следующими префиксами:

  • checked — компилятор вставляет код для проверки результатов арифметических операций, и если результат не может быть представлен без переполнения, выполняет вызов abort(). Специальная конструкция языка будет предназначена для ветвления по условию переполнения при вычислении выражения вместо вызова abort(). (Т.е. в одну ветку коду управление попадает при отсутствии переполнения, в другую при наличии.)
  • wrapped — в случае переполнения старшие биты просто отбрасываются.
  • saturating — в случае переполнения результат заменяется на соответствующее минимальное или максимальное значение типа.
  • safe — отдельное числовое значение (0xFFF... для беззнаковых и 0x800... для знаковых) представляет значение NaN. Переполнение порождает результат NaN. Любая арифметическая операция с использованием NaN также порождает NaN.

Автоматические приведения числовых типов возможно только для тех типов, где весь диапазон значений исходного типа может быть представлен в целевом типе.

Явное приведение типов возможно между любыми числовыми типами, но следует логике соответствующего целевого типа. (Для checked переполнение при приведении типа вызывает abort(), для wrapped биты просто обрезаются и т.п.)

При отсутствии одного из указанных префиксов компилятор использует префикс, указанный в опциях компиляции. Допустимы только варианты: checked и wrapped.

Синонимы целых типов

Синонимы типов, завязанные на особенности реализации:

  • sys.word, sys.iword — целые без знака и со знаком, соответствующие натуральному размеру регистров машины. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.smallword, sys.smallword — целые без знака и со знаком, имеющие разрядность в половину sys.word, sys.iword, в случае, если архитектура машины предоставляет эффективные инструкции для арифметики такого размера. В ином случае эквивалентны sys.word, sys.iword. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.longword, sys.ilongword — целые без знака и со знаком, имеющие разрядность в два раза больше sys.word, sys.iword, либо равные им, в зависимости от настроек компилятора для конкретной архитектуры. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.storage_size — целое без знака, достаточное для хранения максимального размера объекта в оперативной памяти.
  • sys.storage_offset — целое со знаком, достаточное для хранения разности указателей.

Далее:

  • char, char16, char32 — типы, предназначенные для хранения соответственно 8-битных символов, 16-битных код-пойнтов UCS-2 и 32-битных код-пойнтов UCS-4. Автоматические касты этих типов в другие численные типы (и обратно) запрещены, но они могут быть сконвертированны явным приведением типа.

Типы с фиксированной точкой

  • fixedN.M и ufixedN.M — соответственно знаковый и беззнаковый тип с фиксированной точкой. Число N задаёт общую разрядности типа (включая бит знака), а число M — количество бит после двоичной точки. Например fixed32.8 — число со знаком общей разроядностью 32 бита, из которых 8 бит приходятся на дробную часть.

По необходимости компилятор автоматически вставляет вызовы библиотечных функций для работы с этими типами.

Также как и целые, типы с фиксированной точкой могут быть checked, wrapped, saturating и safe.

Типы с плавающей точкой

  • Гарантируются только следующие стандартные типы: float32, float64.
  • float — по умолчанию синоним для `float64. Разрядность типа может быть переопределена вручную через опции компилятора.

Исправление wandrien, :

Планирую такую систему типов. Пока набросок.

Целые типы

  • uint8, uint16, uint32, uint64 и т.п. — целые без знака. Значение результата при переполнении не является UB. (Ну это везде так.)
  • int8, int16, int32, int64 и т.п. — целые со знаком в дополнительном коде. Значение результата при переполнении не является UB. (В отличие от Си.)

Целые типы могут быть любой сколь угодно большой разрядности. Для чисел большой разрядности компилятор автоматически подставляет вызовы библиотечных функций, реализующих соответствующую арифметику.

Типы могут идти со следующими префиксами:

  • checked — компилятор вставляет код для проверки результатов арифметических операций, и если результат не может быть представлен без переполнения, выполняет вызов abort(). Специальная конструкция языка будет предназначена для ветвления по условию переполнения при вычислении выражения вместо вызова abort(). (Т.е. в одну ветку коду управление попадает при отсутствии переполнения, в другую при наличии.)
  • wrapped — в случае переполнения старшие биты просто отбрасываются.
  • saturating — в случае переполнения результат заменяется на соответствующее минимальное или максимальное значение типа.
  • safe — отдельное числовое значение (0xFFF... для беззнаковых и 0x800... для знаковых) представляет значение NaN. Переполнение порождает результат NaN. Любая арифметическая операция с использованием NaN также порождает NaN.

Автоматические приведения числовых типов возможно только для тех типов, где весь диапазон значений исходного типа может быть представлен в целевом типе.

Явное приведение типов возможно между любыми числовыми типами, но следует логике соответствующего целевого типа. (Для checked переполнение при приведении типа вызывает abort(), для wrapped биты просто обрезаются и т.п.)

При отсутствии одного из указанных префиксов компилятор использует префикс, указанный в опциях компиляции.

Синонимы целых типов

Синонимы типов, завязанные на особенности реализации:

  • sys.word, sys.iword — целые без знака и со знаком, соответствующие натуральному размеру регистров машины. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.smallword, sys.smallword — целые без знака и со знаком, имеющие разрядность в половину sys.word, sys.iword, в случае, если архитектура машины предоставляет эффективные инструкции для арифметики такого размера. В ином случае эквивалентны sys.word, sys.iword. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.longword, sys.ilongword — целые без знака и со знаком, имеющие разрядность в два раза больше sys.word, sys.iword, либо равные им, в зависимости от настроек компилятора для конкретной архитектуры. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.storage_size — целое без знака, достаточное для хранения максимального размера объекта в оперативной памяти.
  • sys.storage_offset — целое со знаком, достаточное для хранения разности указателей.

Далее:

  • char, char16, char32 — типы, предназначенные для хранения соответственно 8-битных символов, 16-битных код-пойнтов UCS-2 и 32-битных код-пойнтов UCS-4. Автоматические касты этих типов в другие численные типы (и обратно) запрещены, но они могут быть сконвертированны явным приведением типа.

Типы с фиксированной точкой

  • fixedN.M и ufixedN.M — соответственно знаковый и беззнаковый тип с фиксированной точкой. Число N задаёт общую разрядности типа (включая бит знака), а число M — количество бит после двоичной точки. Например fixed32.8 — число со знаком общей разроядностью 32 бита, из которых 8 бит приходятся на дробную часть.

По необходимости компилятор автоматически вставляет вызовы библиотечных функций для работы с этими типами.

Также как и целые, типы с фиксированной точкой могут быть checked, wrapped, saturating и safe.

Типы с плавающей точкой

  • Гарантируются только следующие стандартные типы: float32, float64.
  • float — по умолчанию синоним для `float64. Разрядность типа может быть переопределена вручную через опции компилятора.

Исходная версия wandrien, :

Планирую такую систему типов. Пока набросок.

Целые типы

  • uint8, uint16, uint32, uint64 и т.п. — целые целые без знака. Значение результата при переполнении не является UB. (Ну это везде так.)
  • int8, int16, int32, int64 и т.п. — целые со знаком в дополнительном коде. Значение результата при переполнении не является UB. (В отличие от Си.)

Целые типы могут быть любой сколь угодно большой разрядности. Для чисел большой разрядности компилятор автоматически подставляет вызовы библиотечных функций, реализующих соответствующую арифметику.

Типы могут идти со следующими префиксами:

  • checked — компилятор вставляет код для проверки результатов арифметических операций, и если результат не может быть представлен без переполнения, выполняет вызов abort(). Специальная конструкция языка будет предназначена для ветвления по условию переполнения при вычислении выражения вместо вызова abort(). (Т.е. в одну ветку коду управление попадает при отсутствии переполнения, в другую при наличии.)
  • wrapped — в случае переполнения старшие биты просто отбрасываются.
  • saturating — в случае переполнения результат заменяется на соответствующее минимальное или максимальное значение типа.
  • safe — отдельное числовое значение (0xFFF... для беззнаковых и 0x800... для знаковых) представляет значение NaN. Переполнение порождает результат NaN. Любая арифметическая операция с использованием NaN также порождает NaN.

Автоматические приведения числовых типов возможно только для тех типов, где весь диапазон значений исходного типа может быть представлен в целевом типе.

Явное приведение типов возможно между любыми числовыми типами, но следует логике соответствующего целевого типа. (Для checked переполнение при приведении типа вызывает abort(), для wrapped биты просто обрезаются и т.п.)

При отсутствии одного из указанных префиксов компилятор использует префикс, указанный в опциях компиляции.

Синонимы целых типов

Синонимы типов, завязанные на особенности реализации:

  • sys.word, sys.iword — целые без знака и со знаком, соответствующие натуральному размеру регистров машины. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.smallword, sys.smallword — целые без знака и со знаком, имеющие разрядность в половину sys.word, sys.iword, в случае, если архитектура машины предоставляет эффективные инструкции для арифметики такого размера. В ином случае эквивалентны sys.word, sys.iword. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.longword, sys.ilongword — целые без знака и со знаком, имеющие разрядность в два раза больше sys.word, sys.iword, либо равные им, в зависимости от настроек компилятора для конкретной архитектуры. Разрядность типа может быть переопределена вручную через опции компилятора.
  • sys.storage_size — целое без знака, достаточное для хранения максимального размера объекта в оперативной памяти.
  • sys.storage_offset — целое со знаком, достаточное для хранения разности указателей.

Далее:

  • char, char16, char32 — типы, предназначенные для хранения соответственно 8-битных символов, 16-битных код-пойнтов UCS-2 и 32-битных код-пойнтов UCS-4. Автоматические касты этих типов в другие численные типы (и обратно) запрещены, но они могут быть сконвертированны явным приведением типа.

Типы с фиксированной точкой

  • fixedN.M и ufixedN.M — соответственно знаковый и беззнаковый тип с фиксированной точкой. Число N задаёт общую разрядности типа (включая бит знака), а число M — количество бит после двоичной точки. Например fixed32.8 — число со знаком общей разроядностью 32 бита, из которых 8 бит приходятся на дробную часть.

По необходимости компилятор автоматически вставляет вызовы библиотечных функций для работы с этими типами.

Также как и целые, типы с фиксированной точкой могут быть checked, wrapped, saturating и safe.

Типы с плавающей точкой

  • Гарантируются только следующие стандартные типы: float32, float64.
  • float — по умолчанию синоним для `float64. Разрядность типа может быть переопределена вручную через опции компилятора.