int для чарта - PullRequest
       1

int для чарта

8 голосов
/ 21 сентября 2011
int i = 259;       /* 03010000 in Little Endian ; 00000103 in Big Endian */
char c = (char)i;  /* returns 03 in both Little and Big Endian?? */

В моем компьютере он назначает 03 для char c , и у меня есть Little Endian, но я не знаю, читает ли преобразование символов наименее значимый байт или читает байт, указанный i переменная.

Ответы [ 4 ]

13 голосов
/ 21 сентября 2011

Endianness на самом деле ничего не меняет здесь. Он не пытается сохранить один из байтов (MSB, LSB и т. Д.).

  • Если char не подписано, оно будет отображаться. Предполагая, что 8-битный символ 259% 256 = 3
  • Если char подписано, результат определяется реализацией. Спасибо pmg : 6.3.1.3/3 в стандарте C99
7 голосов
/ 21 сентября 2011

Поскольку вы преобразуете из большого целочисленного типа в меньший, он занимает наименее значимую часть независимо от порядка следования байтов. Если бы вы указывали вместо этого указатели, он занял бы байт по адресу, который будет зависеть от порядкового номера.

Таким образом, c = (char)i назначает младший байт для c, но c = *((char *)(&i)) назначит первый байт по адресу от i до c, что будет то же самое в системах с прямым порядком байтов только.

1 голос
/ 11 июля 2013

Если вы хотите проверить на маленький / большой порядок байтов, вы можете использовать объединение:

int isBigEndian (void)
{
    union foo {
        size_t i;
        char cp[sizeof(size_t)];
    } u;

    u.i = 1;
    return *u.cp != 1;
}

Это работает, потому что в младшем порядке это будет выглядеть как 01 00 ... 00, но в большомendian, это будет 00 ... 00 01 (... состоит из нулей).Поэтому, если первый байт равен 0, тест возвращает true.В противном случае возвращается false.Однако помните, что существуют также машины со смешанным порядком байтов, которые по-разному хранят данные (некоторые могут переключать порядковый номер, другие просто хранят данные по-разному).PDP-11 сохранил 32-битное int как два 16-битных слова, за исключением того, что порядок слов был обратным (например, 0x01234567 был 4567 0123).

0 голосов
/ 11 июля 2013

При преобразовании из int (4 байта) в char (1 байт) он сохранит последний 1 байт.Например:

int x = 0x3F1;         // 0x3F1 = 0000 0011 1111 0001
char y = (char)x;      // 1111 0001  --> -15 in decimal (with Two's complement)
char z = (unsigned char)x;    // 1111 0001 --> 241 in decimal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...