Переполнение битовых полей

Вам абсолютно нужно физическое устройство. Различие в производительности между средством моделирования и фактическими аппаратными средствами iPhone/iPod Touch огромно. Код, который будет работать хороший и быстрый в средстве моделирования, может легко оказаться слишком медленным, чтобы быть применимым на реальной вещи. Также API, обеспеченный средством моделирования, не на 100% идентичен реальной вещи, таким образом, код, который хорошо работает в sim, не может работать над устройством. Единственный способ знать наверняка состоит в том, чтобы часто тестировать на существующем устройстве.

, Поскольку другие упомянули, iPod touch работает хорошо устройством разработки. Таким образом, если Вам не нужна ни одна из функций iPhone, это - польза, более дешевая, альтернативная.

13
задан Florian 5 February 2011 в 17:46
поделиться

1 ответ

Да. Мы можем получить ответ от [1 111] блок . Вот пример, который я кодирую в Ubuntu 16.04, 64bit, gcc.

#include <stdio.h>

typedef unsigned int uint32_t;

struct {
  uint32_t foo1:8;
  uint32_t foo2:24;
} G;

int main() {
    G.foo1 = 0x12;
    G.foo2 = 0xffffff; // G is 0xfffff12
    printf("G.foo1=0x%02x, G.foo2=0x%06x, G=0x%08x\n", G.foo1, G.foo2, *(uint32_t *)&G);
    G.foo2++; // G.foo2 overflow
    printf("G.foo1=0x%02x, G.foo2=0x%06x, G=0x%08x\n", G.foo1, G.foo2, *(uint32_t *)&G);
    G.foo1 += (0xff-0x12+1); // // G.foo1 overflow
    printf("G.foo1=0x%02x, G.foo2=0x%06x, G=0x%08x\n", G.foo1, G.foo2, *(uint32_t *)&G);
    return 0;
}

Компиляция это с gcc -S <.c file>. Можно получить файл .s блока. Здесь я показываю блок G.foo2++;, и я пишу некоторые комментарии.

movl    G(%rip), %eax
shrl    $8, %eax    #  0xfffff12-->0x00ffffff
addl    $1, %eax    # 0x00ffffff+1=0x01000000
andl    $16777215, %eax # 16777215=0xffffff, so eax still 0x01000000
sall    $8, %eax    # 0x01000000-->0x00000000
movl    %eax, %edx  # edx high-24bit is fool2
movl    G(%rip), %eax   # G.foo2, tmp123
movzbl  %al, %eax   # so eax=0x00000012
orl     %edx, %eax  # eax=0x00000012 | 0x00000000 = 0x00000012
movl    %eax, G(%rip)   # write to G

Мы видим, что компилятор будет использовать команды сдвига для обеспечения то, что Вы говорите. (отметьте: вот расположение памяти G:

----------------------------------
|     foo2-24bit     | foo1-8bit |
----------------------------------

, Конечно, результат вышеупомянутых:

G.foo1=0x12, G.foo2=0xffffff, G=0xffffff12
G.foo1=0x12, G.foo2=0x000000, G=0x00000012
G.foo1=0x00, G.foo2=0x000000, G=0x00000000
0
ответ дан 2 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

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