我想在R中重现以下C代码的第2版。
问题是R似乎没有一个等同于C'(unsigned int)''(unsigned int)'
(R中没有无符号整数)。我看了一些包裹,但不是很容易
找到它。要手动(或使用函数)进行转换,是否需要添加.Machine$integer.max + 1
左右? (但是64位可能需要重现C代码)...
#include <stdio.h>
#include <stdint.h>
int II1 = -1;
int II2 = -2;
int_least64_t a = 1403580;
int_least64_t b = 810728;
int main()
{
int_least64_t p;
/* Version 1 */
p = a * II2 - b * II1;
printf("%lld\n", (int_least64_t)(p)); /* -1996432 */
/* Version 2 */
p = a * (unsigned int)II2 - b * (unsigned int)II1;
printf("%lld\n", (int_least64_t)(p)); /* 2546279949371760 */
return 0;
}
这将在R中复制版本1(可能也是32位而不是64位):
II1 <- -1
II2 <- -2
a <- 1403580
b <- 810728
a * II2 - b * II1
答案 0 :(得分:2)
# from bmp:::ConvertIntToUInt()
int_to_unit <- function (x, adjustment=2^32) {
x <- as.numeric(x)
signs <- sign(x)
x[signs < 0] <- x[signs < 0] + adjustment
x
}
II1 <- -1L
II2 <- -2L
a <- 1403580L
b <- 810728L
(p <- a * II2 - b * II1)
## [1] -1996432
(p <- a * int_to_uint(II2) - b * int_to_uint(II1))
## [1] 2546279949371760
请注意,您不会返回整数。毕竟这是R.如果你不打算改变价值观,情况就会好转。