2015-06-03 5 views
1

говорит, у меня есть следующие union:Проблемы с uint64_t типом

typedef union 
{ 
    char array[8]; 
    uint64_t u64; 
} my_type ; 

Я хочу, чтобы переместить один бит 1 через все 64 бит зарезервированных, здесь является то, что я пробовал:

........................... 
    my_type vector ={0}; 
    short index =0; 
    for (index=0 ; index <64;index++){ 
      printf(" u64 : %d\n", vektor.u64); 
      vektor.u64 = (1<<index) ; 
     } 

выход прекрасно сообщает 15th, и это не проблема с параметрами printf, значение определенно неверно = 0. вот вывод:

 u64 : 0 
    u64 : 1 
    u64 : 2 
    u64 : 4 
    u64 : 8 
    u64 : 16 
    u64 : 32 
    u64 : 64 
    u64 : 128 
    u64 : 256 
    u64 : 512 
    u64 : 1024 
    u64 : 2048 
    u64 : 4096 
    u64 : 8192 
    u64 : 16384 
    u64 : -32768 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 
    u64 : 0 

Так что мой вопрос в том, что я делаю неправильно? Кстати, я использую ATmelStudio6.2.

+1

предупреждения Включите компилятор, и компилятор скажет вам, что вы используете неправильный формат. – gnasher729

+1

1 << индекс на 32-битном компьютере - неопределенное поведение при индексе ≥ 32. – gnasher729

+0

нужно объявить 1 как 64-битную длину – user3629249

ответ

2

Еще одна проблема, кроме форматирования указал Sourav, является то, что значение 1 является int, и маловероятно, что int 64 бита (на самом деле, мне кажется, что на вашей платформе int находится всего в 16 бит).

Вам необходимо использовать, например, 1ULL, чтобы получить unsigned long long, который может быть сдвинут на 64 бит.

+0

@Joachim Я тоже долго пробовал без знака, но это не помогло! – Engine

+0

@ На какой платформе вы запускаете этот код? – nos

+0

Я использую ATxmega32A4U, который является 32-битным uC – Engine

1

Я считаю, что вы сталкиваетесь с проблемами с использованием спецификатора формата. %d ожидает int который vektor.u64 нет.

Чтобы напечатать файл uint64_t безопасно, вы должны использовать PRIu64 в качестве спецификатора формата. Он доступен в файле заголовков inttypes.h.

Вы можете изменить

printf(" u64 : %d\n", vektor.u64); 

в

printf(" u64 :" PRIu64 "\n", vektor.u64); 

EDIT:

AS упоминается в other answer г @Joachim Pileborg, вам необходимо изменить целочисленный литерал1 до 1ULL, чтобы убедиться, что это как unsigned long long.

+0

проблема не является результатом, я использую переменную в другом месте, это значение определенно 0. и я trieb с использованием PRIu64, но я получил ошибку: ожидаю) перед PRIu64! – Engine

+0

@ У вас есть файл заголовка? –

+0

вы имеете в виду inttypes.h да, я сделал! – Engine

0

Ниже представлена ​​измененная версия вашего кода.

Это упрощает удаление беспорядка.

Однако он показывает правильный способ выполнения желаемой операции.

#include <stdio.h> 

int main(void) 
{ 
    unsigned long long u64Bits; 
    short index =0; 

    for (index=0 ; index <64;index++) 
    { 
      printf(" u64 : %llu\n", u64Bits); 
      u64Bits = ((unsigned long long)1<<index) ; 
    } 
    return(0); 
} 

здесь выход кода выше:

u64 : 0 
    u64 : 1 
    u64 : 2 
    u64 : 4 
    u64 : 8 
    u64 : 16 
    u64 : 32 
    u64 : 64 
    u64 : 128 
    u64 : 256 
    u64 : 512 
    u64 : 1024 
    u64 : 2048 
    u64 : 4096 
    u64 : 8192 
    u64 : 16384 
    u64 : 32768 
    u64 : 65536 
    u64 : 131072 
    u64 : 262144 
    u64 : 524288 
    u64 : 1048576 
    u64 : 2097152 
    u64 : 4194304 
    u64 : 8388608 
    u64 : 16777216 
    u64 : 33554432 
    u64 : 67108864 
    u64 : 134217728 
    u64 : 268435456 
    u64 : 536870912 
    u64 : 1073741824 
    u64 : 2147483648 
    u64 : 4294967296 
    u64 : 8589934592 
    u64 : 17179869184 
    u64 : 34359738368 
    u64 : 68719476736 
    u64 : 137438953472 
    u64 : 274877906944 
    u64 : 549755813888 
    u64 : 1099511627776 
    u64 : 2199023255552 
    u64 : 4398046511104 
    u64 : 8796093022208 
    u64 : 17592186044416 
    u64 : 35184372088832 
    u64 : 70368744177664 
    u64 : 140737488355328 
    u64 : 281474976710656 
    u64 : 562949953421312 
    u64 : 1125899906842624 
    u64 : 2251799813685248 
    u64 : 4503599627370496 
    u64 : 9007199254740992 
    u64 : 18014398509481984 
    u64 : 36028797018963968 
    u64 : 72057594037927936 
    u64 : 144115188075855872 
    u64 : 288230376151711744 
    u64 : 576460752303423488 
    u64 : 1152921504606846976 
    u64 : 2305843009213693952 
    u64 : 4611686018427387904 
+0

обратите внимание на изменения в инструкции printf() и на оператор сдвига слева – user3629249

 Смежные вопросы

  • Нет связанных вопросов^_^