LINUX.ORG.RU

>> and uint8_t (проверить простенький код на Си)

 


1

1
$ cat shift.c 
#include <stdio.h> // printf()
#include <stdint.h> // uint*_t

int main()
{
        uint64_t id = 0x0102030405060708; // 64 bits
        printf("%0llX\n", (long long unsigned int)id);
        uint8_t c = 0x00;
        uint8_t wrbuf[8];
        c = (id >> 0);  wrbuf[0] = ((c && 0x07) + '0');
        c = (id >> 8);  wrbuf[1] = ((c && 0x07) + '0');
        c = (id >> 16); wrbuf[2] = ((c && 0x07) + '0');
        c = (id >> 24); wrbuf[3] = ((c && 0x07) + '0');
        printf("%02X\n", wrbuf[0]);
        printf("%02X\n", wrbuf[1]);
        printf("%02X\n", wrbuf[2]);
        printf("%02X\n", wrbuf[3]);
        return 0;
}

$ gcc-4.6 shift.c

$ ./a.out 
102030405060708
31
31
31
31

Что-то я совершенно туплю. Почему выдается 0x31?

★★★★★
Ответ на: комментарий от note173

&&

тьфу. я начал забывать Си ^_^

pacify ★★★★★
() автор топика

Рекомендую таки осилить GDB.

$ gcc -g -O0 shift.c 
$ gdb ./a.out
GNU gdb (GDB) 7.4.1
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
Reading symbols from a.out...done.
(gdb) break main
Breakpoint 1 at 0x100004a8: file shift.c, line 6.
(gdb) run
Starting program: a.out 

Breakpoint 1, main () at shift.c:6
6               uint64_t id = 0x0102030405060708; // 64 bits
(gdb) n
7               printf("%0llX\n", (long long unsigned int)id);
(gdb) p id
$1 = 72623859790382856
(gdb) p/x id
$2 = 0x102030405060708
(gdb) n
102030405060708
8               uint8_t c = 0x00;
(gdb) n
10              c = (id >> 0);  wrbuf[0] = ((c && 0x07) + '0');
(gdb) p wrbuf[0]
$3 = 16 '\020'
(gdb) n
11              c = (id >> 8);  wrbuf[1] = ((c && 0x07) + '0');
(gdb) p wrbuf[0]
$4 = 49 '1'
(gdb) p wrbuf[1]
$5 = 0 '\000'

mr_doug
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.