2015-02-06 1 views
3

У меня есть следующий фрагмент кодаLittle Endian и большое назначение младших

int i = 321; 
char ch = i; 
printf("%d", ch); 

i в двоичном виде 00000000 00000000 00000001 01000001 и выход 65. Из приведенного выше кода я понимаю, что с char занимает всего 1 байт памяти, первые 3 байта i отбрасываются, а последний байт присваивается ch. Отсюда и результат.

Моя машина малоэтажная. Является ли результат в ch основанной на контенте базовой машины? Просьба уточнить.

+5

Если вы используете арифметику указателя, библиотека времени c должна абстрагироваться от утверждения. Сужение int до char эффективно является модульной операцией, и iirc определяется таким образом в стандарте (лучше искать, хотя ...) – collapsar

+0

Итак, прямой ответ: Нет, этот результат hasnüt ничего не делает с энтиансой. – deviantfan

+1

Если по умолчанию 'char' является типом подписанных данных в вашей среде (что более распространено, чем нет), то поведение, связанное с назначением значения вне диапазона переменной' char', равно * undefined *. –

ответ

1

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

int i = 232; 
int *p_i = &i; 
char* pc_i = (char*)p_i; 
printf("%d", (int)(*pc_i)); 

Дает правильный ответ на малоэтажные архитектуры, но неверный ответ на архитектуру большого конца. (type punning to char * не нарушает правила строгой алиасии)

+1

Ваш 'printf()' неверен. Кажется, вы хотите 'printf («% d », (int) * pc_i)» или, возможно, 'printf («% c », * pc_i)». Разумеется, вы должны разыменовать указатель, и вы не можете безопасно обойтись без броска в варианте «% d», потому что вы не знаете, является ли символ «char» подписным. –

-2

Ваш код будет работать одинаково на всех видах машин. Значение int, сбрасываемое на символ, оставит вас с битами i, которые вписываются в ch.

Для того, чтобы увидеть конечную точку вашей машины, вам нужно будет указать указатели, указывающие на ваш int.

int i = 321; 
char ch = *((char *)&i); 

Или используйте союзы умными способами. Вы даже можете производить нарушения прав доступа с этой вещью, если ваша машина разборчива о выравнивании ...

union Foo { int i; char c; } foo; foo.i = 321; char ch = foo.c; 
+1

Нет, код создает * поведение, определяемое реализацией * в любой из многих сред C, где по умолчанию 'char' является * подписанным *, 8-битным типом. Код не требуется для работы с одной такой машиной на другой. –

+0

Я не говорил, что этот код будет иметь какие-либо свойства, кроме как показывать способы, как вы можете сделать свои конечные цели. Я даже не выпустил теорию о том, как эти различия проявятся. Фрагменты кода предназначены для контраста кода в исходном сообщении, на который не влияет endianess. – BitTickler

1

Нет, результат ch не на основе байт подстилающей машины.

C не имеет понятия о контенте AFAIK. char ch = i эквивалентен char ch = i % CHAR_MAX.

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

#include <limits.h> 
#include <stdio.h> 

int main() 
{ 
    // INT_MAX = 01111111111111111111111111111 
    int i = INT_MAX; 

    unsigned char * front = &i; 

    // This assumes ints are 4 bytes long, not a safe assumption! 
    unsigned char * back = front + 3; 

    printf ("%d %d", *front, *back); 
    // Prints 255 127. My machine is little-endian. 
} 
7

Цитирование C11, 6.3.1.3:

1 Когда значение с целым типом преобразуется в другой целочисленный тип , отличный от _Bool, если значение может быть представлено новым типом, оно не изменилось.

2 В противном случае, если новый тип без знака, значение преобразуется путем многократного сложения или вычитания на единицу больше максимальное значение, которое может быть представлено в новом типе, пока значение находится в диапазоне от нового тип.

3 В противном случае новый тип подписан и его значение не может быть представлено ; либо результат определяется реализацией, либо генерируется сигнал, определяемый реализацией .

Стандартные переговоры только о значениях. Итак, если char не имеет знака: 321-256 = 65.Если char подписан, поведение определяется реализацией.

+2

Где «определенная реализация» * может * отражать сущность базового представления. –

+0

@ user36740 char подписан в моем случае, а значение ch равно 65. Можете ли вы рассказать мне, что вы имели в виду под «реализацией»? –

+1

В довольно теоретической ситуации, когда подписанные символы не представлены двойным дополнением, вы вполне можете получить другое значение. Но я не знаю, какая машина делает это в нашем углу галактики. – BitTickler

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