Как отрицательные числа представляются в 32-разрядном целом числе со знаком?

Не видел этого вопроса раньше, и похоже, что @Romain обратился к нему.

Для полноты рабочий пример того, как это сделать, когда все стороны играют, предоставляется xts и RcppXts. В xts мы делаем это (около десяти функций) в файле (source) inst/include/xtsAPI.h:

SEXP attribute_hidden xtsLag(SEXP x, SEXP k, SEXP pad) {     
    static SEXP(*fun)(SEXP,SEXP,SEXP) = NULL;         
    if (fun == NULL)                                  
        fun = (SEXP(*)(SEXP,SEXP,SEXP)) R_GetCCallable("xts","lagXts");   
    return fun(x, k, pad);                               
}  

вместе с обычной работой R_registerRoutines и R_RegisterCCallable.

В RcppXts это подбирается (в модуле Rcpp) как

function("xtsLag", 
         &xtsLag,    
         List::create(Named("x"), Named("k"), Named("pad")),   
         "Extract the coredata from xts object");

, который работает очень хорошо. Кто-то сделал мне выговор, чтобы написать xts сторону более компактно (поскольку if NULL является ложным), который я получу ... в конце концов.

14
задан Ahmad Farid 28 May 2010 в 18:39
поделиться

5 ответов

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

Для представления с дополнением до двух старший значащий («крайний левый») бит называется битом знака , и он будет установлен для отрицательного целого числа и сброшен для неотрицательного целое число. Однако это больше, чем просто «флаг». См. статью Википедии для получения дополнительной информации.

17
ответ дан 1 December 2019 в 09:12
поделиться

Обычно это дополнение до двух.

4
ответ дан 1 December 2019 в 09:12
поделиться

Из стандарта C99:

Для знаковых целочисленных типов, биты представления объекта должны быть разделены на три группы: биты значения, биты подстановки и бит знака. Здесь не должно быть никаких битов прокладки; должен быть должен быть ровно один бит знака. Каждый бит, являющийся битом значения, должен иметь то же значение, что и тот же бит в объектном представлении соответствующего беззнакового типа (если есть M битов значения в знаковом типе и N в беззнаковом типе, то M = N). Если бит знака равен нулю, то это не должно не влияет на результирующее значение. Если бит знака равен единице, то значение должно быть модифицировано одним из следующих способов:

- соответствующее значение с битом знака бит 0 отрицается (знак и величина);

- бит знака имеет значение -(2N) (дополнение двух);

- бит знака имеет значение -(2N - 1) (дополнение единицы).

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

4
ответ дан 1 December 2019 в 09:12
поделиться

Старший бит (последний бит слева) устанавливается для отрицательных чисел.

0
ответ дан 1 December 2019 в 09:12
поделиться
0xFFFFFFFF = -1
0xFFFFFFFE = -2
0xFFFFFFFD = -3
... 

и так далее

1
ответ дан 1 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: