Для набора читаемости invuint = ~0u
и invushort = ~((short)0u)
, чем мы можем сделать invuint - invushort
, что либо 0
, либо нет0
в стандартном C равно false
, поэтому вы можете просто с помощью !(invuint - invushort)
увидеть, подходит ли unsigned int
к unsigned short
.
Но это, скорее всего, не то, что выпопросили сделать, это было бы слишком легко.Если вам нужно знать, подходит ли содержимое unsigned int
к unsigned short
, это немного усложняется.
Мы можем использовать incushort = ~((short)0u)
здесь как маску.
С an_uint = 0; an_uint = incushort
мы устанавливаем младшие биты an_uint
в единицы, поэтому у нас 0x0000ffff
.Если перевернуть это с ~an_uint
, вы получите 0xXXXX0000
, где X
означает неизвестное количество единиц.Поэтому, если sizeof(unsigned int) == sizeof(unsigned short)
, мы получим 0
, но мы могли бы сделать это проще, см. Выше.
Если мы используем mask = 0xXXXX0000
в качестве маски, чтобы получить все биты, которые больше unsigned short
с uint_with_unknown_content & mask
мы получаем 0
, если uint_with_unknown_content
вписывается в unsigned short
.