Тип данных вопрос - PullRequest
       1

Тип данных вопрос

1 голос
/ 06 января 2011

Я пытаюсь перенести программу на C на архитектуру SPARC, которая имеет следующее объявление типа

#include <stdint.h>

typedef uint32_t  WORD ;
typedef uint64_t DWORD ; 

Проблема в том, что компилятор говорит мне, что stdint.h не может быть найден. Следовательно, Я переопределил эти типы данных следующим образом:

unsigned int  WORD; 
unsigned long DWORD;

Это кажется простым заявлением, но программа не ожидает, как следует. Может быть, я что-то пропустил?

Спасибо

Ответы [ 3 ]

1 голос
/ 06 января 2011

<stdint.h> и типы uint32_t и uint64_t являются «новыми» в ИСО / МЭК 9899: 1999. Ваш компилятор может соответствовать только предыдущей версии стандарта.

Если вы уверены, что unsigned int и unsigned long являются 32-битными и 64-битными соответственно, то у вас не должно быть проблем (по крайней мере, из-за самих typedef) Как и вы, это может быть не так. Вы знаете (или можете узнать), поддерживает ли ваш компилятор unsigned long long?

Я предполагаю, что unsigned int, вероятно, 32-разрядный, сколько лет вашему SPARC?

0 голосов
/ 06 января 2011

Итак, вам нужно 32-разрядное целое число, а другое 64-разрядное.

Возможно, что int и long одинаковы в вашей архитектуре, и если ваш компилятор поддерживает long long, это может быть 64 бит, в то время как int может быть 32 бит. Проверьте документацию вашего компилятора на предмет его поддержки и наличия расширения (например, некоторые компиляторы могут предоставлять тип __int64). Это может быть то, что вам нужно:

  typedef unsigned int  WORD; 
  typedef unsigned long long DWORD;

В любом случае, я бы написал небольшую программу для проверки размеров целых чисел на вашем хосте, чтобы вы могли выбрать правильный, то есть printf sizeof (int), sizeof (long) и так далее. (На хосте sparc значение CHAR_BIT будет равно 8, поэтому по меньшей мере это кратно 8 битам.)

Кроме того, поскольку вы портируете на хост sparc, убедитесь, что ваш код не содержит ошибок в отношении endianess

0 голосов
/ 06 января 2011

Если ваш компилятор / ОС не имеет <stdint.h>, то лучше всего реализовать собственную версию этого заголовка, а не изменять код, который вы пытаетесь портировать. Вероятно, вам нужно только подмножество типов, которые обычно определены в <stdint.h>, например,

//
// stdint.h
//

typedef int int32_t; // signed 32 bit int
typedef unsigned long long uint64_t; // unsigned 64 bit int

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...