Разница между Uint и без знака Int? - PullRequest
49 голосов
/ 15 апреля 2011

Есть ли разница между uint и unsigned int?Я смотрю на сайте, но все вопросы относятся к C # или C ++.Я хотел бы получить ответ о C.

Обратите внимание, что я использую GCC под Linux.

Ответы [ 5 ]

67 голосов
/ 15 апреля 2011

uint не является стандартным типом - unsigned int - это.

33 голосов
/ 15 апреля 2011

Некоторые системы могут определять uint как typedef.

typedef unsigned int uint;

Для этих систем они одинаковы.Но uint не является стандартным типом, поэтому каждая система может не поддерживать его и, следовательно, он не переносим.

17 голосов
/ 03 августа 2013

Я расширяю немного ответов Эрика, Теомана Сойгула и Taskinoor

uint не является стандартом.

Поэтому использовать вашу собственную стенографию, как это, не рекомендуется:

typedef unsigned int uint;

Если вместо этого вы ищете специфику платформы (например, вам нужно указать количество бит, которые занимает ваш int), включая stdint.h :

#include <stdint.h>

выставит следующие стандартные категории целых чисел:

  • Целочисленные типы, имеющие определенную точную ширину

  • Целочисленные типы, имеющие хотя бы определенную указанную ширину

  • Самые быстрые целочисленные типы, имеющие хотя бы определенную указанную ширину

  • Целочисленные типы, достаточно широкие, чтобы содержать указатели на объекты

  • Целочисленные типы, имеющие наибольшую ширину

Например,

Целочисленные типы с точной шириной

Имя typedef int N _t обозначает целочисленный тип со знаком с шириной N, нет дополнительных битов и представление с дополнением до двух. Таким образом, int8_t обозначает целочисленный тип со знаком шириной ровно 8 бит.

typedef name uint N _t обозначает целочисленный тип без знака с width N. Таким образом, uint24_t обозначает целочисленный тип без знака с шириной. ровно 24 бит.

определяет

int8_t
int16_t
int32_t
uint8_t
uint16_t
uint32_t
7 голосов
/ 07 мая 2016

Во всех ответах здесь не упоминается истинная причина uint.
Это, очевидно, typedef из unsigned int, но это не объясняет его полезность.

Реальнаявопрос в том,

Зачем кому-то хотеть печатать определение базового типа для сокращенной версии?

Чтобы сэкономить на наборе?
Нет, они сделали это изнеобходимость.

Рассмотрим язык C;язык, в котором нет шаблонов.
Как бы вы выполнили штампование своего собственного вектора, который может содержать любой тип?

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

Итак, вы бы определили свой шаблонный вектор:

#define define_vector(type) \
  typedef struct vector_##type { \
    impl \
  };

Объявите ваши типы:

define_vector(int)
define_vector(float)
define_vector(unsigned int)

И после генерации поймите, что типы должны быть одним токеном:

typedef struct vector_int { impl };
typedef struct vector_float { impl };
typedef struct vector_unsigned int { impl };
7 голосов
/ 15 апреля 2011

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

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