Я не понимаю, почему v должен быть символом *.Почему это не может быть коротким *?
Это не может быть short*
, потому что addb
имеет размер байтового операнда, а %sil
является 8-битным регистром.short
- это 16-битный тип в C ABI для x86-64.(ISO C требует, чтобы short
было не менее 16 битов.)
Размер операнда для add
определяет, сколько байтов в памяти изменяется, то есть размер представления объекта *v
.
Если бы *v
было short
, было бы ошибкой отбрасывать вынос из младшего байта вместо того, чтобы позволять ему распространяться в старший байт, даже если по какой-то причине мы зналиЗначение b
было небольшим.
sizeof(b) = 2
- это трюк / красная сельдь:
В правилах C типы, более узкие, чем int
, являются операндами для таких операторов, как +=
повышается до int
, а затем результат сложения int
преобразуется обратно в тип назначения.
Так что *v += b
не имеет значения, шире b
илиуже *v
. Вот почему вопрос должен был ответить вам sizeof(b)
;потому что вы не можете сделать вывод из инструкции addb
, и он не должен соответствовать типу *v
.
В x86-64 System V и Windows x64единственными 16-битными целочисленными типами являются short
и unsigned short
, поэтому sizeof(b) == 2
говорит нам, что b
равно short
или unsigned short
.
(эти ABI также имеют CHAR_BIT = 8т. е. 1 байт char
, что нормально для машин с байтово-адресуемой памятью.)
Типы фиксированной ширины, такие как uint8_t
и int16_t
, являются typedefs для unsigned char
и short
и тд.Я не считаю их за это.
Этот вопрос также позволяет нам исключать неподписанные типы, что мы не могли из asm.Добавление без знака и добавление дополнения 2 - это одна и та же двоичная операция.