unsigned int vs unsigned long оба являются 32-битными, но я не могу их смешать без приведения ... почему? - PullRequest
0 голосов
/ 14 июня 2019

Мой компьютер показывает, что sizeof unsigned long и unsigned int совпадают.

Однако при передаче аргументов в методы ... точнее, указатели ... я должен преобразовать unsigned int в unsigned long.В противном случае ошибка сборки Compiler Error C2664":'function' : cannot convert argument n from 'type1' to 'type2'

Почему?

1 Ответ

2 голосов
/ 14 июня 2019

Это совершенно не связанные типы для компилятора.Передача указателя типа любого , кроме того, который ожидает аргумент, является ошибкой.

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

C ++ существовал достаточно долго, чтобы int и long меняли размер по мере появления новых архитектур ЦП.Размер int и long зависит от компилятора и платформы, с которой вы работаете, поэтому приведение int* в long* (или наоборот) может привести вас к всевозможным проблемам если они не одинакового размера.

Согласно стандарту C ++ это размеры int и long для различных платформ:

type | C++ standard | LP32 | ILP32 | LLP64 | LP64
-------------------------------------------------
int  | at least 16  | 16   | 32    | 32    | 32      bits
long | at least 32  | 32   | 32    | 32    | 64      bits

Только с ILP32 и LLP64 можно с уверенностью предположить, что int и long имеют одинаковый размер, но поддержка этого предположения в компиляторе позволит вам писать код, который не компилируется и не выполняется безопаснона других платформах.

Наконец, если вам нужна гарантия того, что размер целого числа одинаков для всех платформ, вы можете #include <cstdint> и использовать такие типы, как int16_t, uint16_t, int32_t и т. Д. Эти целые числа фиксированной ширины доступны с компиляторами, поддерживающими C ++ 11 и более поздние версии.

...