endianess и целочисленная переменная - PullRequest
3 голосов
/ 13 апреля 2011

В c меня мало волнует понятие endianess. Предположим, что я объявляю целое число (2 байта) на машине с прямым порядком байтов как

int a = 1;

и хранится как:

Address   value
1000       1
1001       0

На старшем порядке он должен храниться как наоборот. Теперь, если я сделаю & a, тогда я получу 1000 на обеих машинах.

Если это так, то если я храню int a=1, тогда я должен получить a = 1 для младшего порядка, тогда как 2 ^ 15 для старшего порядка. Это правильно?

Ответы [ 4 ]

2 голосов
/ 13 апреля 2011

Как в младшем, так и в старшем порядке возвращается адрес «первого» байта. Здесь под «первым» я имею в виду 1000 в вашем примере, а не «первым» в смысле старшего или младшего байта.

2 голосов
/ 13 апреля 2011

Для вас не должно иметь значения, как представлены данные, если вы не передаете их между платформами (или не получаете к ним доступ через код сборки).

Если вы используете только стандартный C - он скрыт отты и ты не должны беспокоить себя этим.Если вы передаете данные между неизвестными машинами (например, у вас есть клиентское и серверное приложение, которое обменивается данными через какую-то сеть) - используйте функции hton и ntoh, которые преобразуют из локальной сети в сетевую и из сети в локальную последовательностьпроблемы.

Если вы обращаетесь к памяти напрямую, проблема будет не только в обратном порядке, но и в упаковке, поэтому будьте осторожны с этим.

1 голос
/ 13 апреля 2011

Теперь, если я сделаю &a, я получу 1000 с прямым порядком байтов и 1001 с прямым порядком байтов.

Нет;на обеих машинах вы получите адрес 1000.

Если это так, то если я храню int a = 1, тогда я должен получить a = 1 для младшего порядка, тогда как 2 ^ 15 для старшего порядка.Это правильно?

Нет;потому что предварительное условие ложно.Кроме того, если вы присвоите 1 переменной, а затем снова прочитаете значение, вы получите результат 1 обратно.Все остальное будет основной причиной путаницы.(Бывают случаи, когда это (чтение сохраненного значения) не гарантируется, например, если переменная может изменяться несколькими потоками или это регистр ввода-вывода во встроенной системе. Однако вы должны знать,из них, если вам нужно было знать об этом.)

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

0 голосов
/ 13 апреля 2011

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

Кроме того, если вы читаете / пишете из текстовых файлов, это не будет проблемой.

...