Как я могу моделировать объединение C++ в C#?

Другие ответы верны. Но я хочу добавить, что это пережиток того времени, когда люди впервые изучали CSS и злоупотребляли float, чтобы делать все свои макеты. float предназначен для создания таких вещей, как плавающие изображения рядом с длинными сериями текста, но многие люди использовали его в качестве основного механизма компоновки. Поскольку это не было предназначено для этого, вам нужны такие хаки, как «clearfix», чтобы заставить его работать.

В наши дни display: inline-block является хорошей альтернативой ( за исключением IE6 и IE7 ), хотя более современные браузеры поставляются с еще более полезными механизмами размещения под такими именами, как flexbox, grid layout и т. Д.

9
задан Shog9 21 July 2009 в 23:22
поделиться

3 ответа

Причина в том, что FieldOffsetAttribute принимает количество байтов как параметр - не количество бит. Это работает так, как ожидалось:

[StructLayout(LayoutKind.Explicit)]
struct STRUCT
{
    [FieldOffset(0)]
    public Int64 fieldTotal;

    [FieldOffset(0)]
    public Int32 fieldFirst;

    [FieldOffset(4)]
    public Int32 fieldSecond;
}
10
ответ дан 4 December 2019 в 10:33
поделиться

Просмотр шестнадцатеричных значений, если Int32.MaxValue и Int64 .MaxValue должен дать ответ.

Ключ - это самый старший бит. Для положительного целого числа старший бит устанавливается только для отрицательного числа. Таким образом, максимальное значение Int32 - это 0, за которым следует целая серия единиц. Порядок не важен, просто будет хотя бы один нулевой бит. То же самое и с Int64.MaxValue.

Теперь подумайте, как должен работать профсоюз. По сути, он будет располагать биты значений рядом друг с другом. Итак, теперь у вас есть набор бит длиной 64, который содержит два нулевых значения. По одному для каждого экземпляра Int32.MaxValue. Это никогда не может быть равно Int64.MaxValue, поскольку может содержать только один нулевой бит.

Как ни странно, вы, вероятно, получите желаемое поведение, если установите для fieldSecond значение Int32.MinValue.

РЕДАКТИРОВАТЬ Упущено, что вам также нужно сделать его FieldOffset (4).

6
ответ дан 4 December 2019 в 10:33
поделиться

Бен М предоставил один из наиболее важных элементов - ваше определение неправильно настроено.

При этом это не будет работать - даже в C ++ с объединением. Указанные вами значения не будут (и не должны быть) теми же значениями, поскольку вы используете знаковые (не беззнаковые) целые числа. Со знаком int (Int32) у вас будет бит 0, за которым следует 1 бит. Когда вы выполняете объединение, у вас будет бит 0, за которым следует группа из 1 бит, затем еще один бит 0, затем группа из 1 бит ... Второй бит 0 - это то, что вас беспокоит.

Если бы вы использовали UInt32 / UInt64, это свойство работало бы, так как лишний бит знака не существует.

4
ответ дан 4 December 2019 в 10:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: