标签: integer-arithmetic

存在溢出时的整数运算

处理两个32位整数值A和B,以按照以下规则给出32位整数C和D. 哪些规则是可逆的?也就是说在所有情况下都可以获得给定c和D的A和B?

A. C =(int32)(A + B),D =(int32)(AB)

B. C =(int32)(A + B),D =(int32)((AB)>> 1)

C.C =(int32)(A + B),D = B.

D. C =(int32)(A + B),D =(int32)(A + 2*B)

E. C =(int32)(A*B),D =(int32)(A/B)

关于整数运算的几个问题.模块化加成形成称为阿贝尔群的数学结构.签名加法怎么样?它也是可交换的(这是"阿贝尔"部分进入的地方)和联想,这是一个阿贝尔群体吗?

鉴于整数加法是可交换和关联的,C显然是正确的,因为我们可以通过(A +(BB))检索A. D怎么样?我们可以假设2 * B = B + Bst.B = A+B+B-(A+B)

乘法更复杂,但我知道如果有溢出则无法检索A.

c c++ integer-arithmetic

0
推荐指数
1
解决办法
271
查看次数

两个16位数的乘法 - 为什么结果是32位长?

如果我将两个16位数相乘,结果将是32位长.但为什么会这样呢?这有什么明确的解释?

并且为了正确理解:对此的计算是:n位数乘以m位数给出(n + m)位数?

binary assembly bits multiplication integer-arithmetic

0
推荐指数
1
解决办法
2911
查看次数

从Int的符号计算位掩码的最快方法是什么?

是的,我知道这是一个有点疯狂的问题.请不要问我是否真的需要知道答案,或者这是否真的是"我的"问题.谢谢.

有时以下功能非常好:

isNeg# :: Int# -> Int#
isNeg# x
   | x <# 0#   = -1#
   | otherwise = 0#
Run Code Online (Sandbox Code Playgroud)

例如,它可以像这样使用:

cc# f x y = word2Int# (f (int2Word# x) (int2Word# y))

andi# x y = cc# and# x y
xori# x y = cc# xor# x y
ori# x y = cc# or# x y

ifNegFstElseSnd# :: Int# -> Int# -> Int#
ifNegFstElseSnd# x y = case isNeg# x of
                         n -> ori# (andi# n y) (xori# n y)
Run Code Online (Sandbox Code Playgroud)

当 …

haskell integer-arithmetic

0
推荐指数
1
解决办法
312
查看次数

C unsigned int比较 - 包含自定义位数

我正在读取一个24位值,现在变成一个uint32_t变量.

在我的头撞墙后计算两个这样的变量之间的区别,并认为"它是无符号的!为什么这个溢出是一个问题?!",我意识到这些值超出了包含它们的变量的大小.

这是一个计数器,因此人们知道它比另一个"更大",尽管可能已经溢出.

因此,0x1 - 0x2 = 0xFFFFFFFF但应该是0x00FFFFFF.

我该如何处理这个问题?

  • 定义一个类型uint24;
  • if/ else在做适当算术之前更大;
  • 还有什么别的我没有想到的?

"最佳"应被解释为"最佳实践"/"最具可读性"/"最安全".

c unsigned types integer-arithmetic

0
推荐指数
1
解决办法
1009
查看次数

GCC:溢出的未定义行为是否应该保持逻辑一致性?

以下代码在我的系统上产生奇怪的东西:

#include <stdio.h>

void f (int x) {
  int y = x + x;
  int v = !y;
  if (x == (1 << 31))
    printf ("y: %d, !y: %d\n", y, !y);
}

int main () {
  f (1 << 31);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译-O1,这打印y: 0, !y: 0.

现在,除了删除int vif行产生预期结果的令人费解的事实之外,我对溢出转换为逻辑不一致的未定义行为感到不舒服。

这应该被认为是一个错误,还是 GCC 团队的理念是,一个意外的行为可以级联成逻辑矛盾?

c gcc overflow undefined-behavior integer-arithmetic

0
推荐指数
1
解决办法
95
查看次数

为什么我的int乘法结果是错误的?

我有以下代码,其中结果超出了整数类型变量可以存储的限制,并且需要了解为什么我得到这个结果(268,435,456=2^28)

public static void main(String[] args) {
int x = 16+256;
for( int i =0; i<6; i++) {
            x*=16;
        }
        System.out.println(x);
}
}
Run Code Online (Sandbox Code Playgroud)

java integer integer-arithmetic

0
推荐指数
1
解决办法
56
查看次数

Rust 相对数组索引

我是一名相当高级的程序员(有 Java、Python、C#、C、C++ 经验),现在第一次尝试学习 Rust。Rust 与我之前尝试过的任何语言都非常不同,所以我很挣扎。为了了解这门语言,我正在实现一个小游戏。

在我的代码中的某个时刻,我想访问“板”中的一个元素和周围的元素。如果我的元素位于板的边缘(索引 0 或索引最大值),我需要一个剪裁值(例如索引 0 - 1 == 0) 如果我简化这个用例,我会尝试从数组和相对索引。下面是一个非常小的例子:

fn get_elements(array: &Vec<char>, i: usize, dx: i8) -> (char, char) {
    let center = array[i];
    let other = array[i+dx];
    (center, other)
}

fn main() {
    let data = vec!['a', 'b', 'c', 'd', 'e'];
    let (c, o) = get_elements(&data, 2, -1);
}
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这无法编译,因为no implementation for `usize + i8` . 我理解这是因为对于无符号数来说,减去零以下的行为是未定义的。然而,我不清楚如何在 Rust 中实现所需的行为。

unsigned-integer rust integer-arithmetic

0
推荐指数
1
解决办法
103
查看次数

在perl单线程中添加

我正在尝试使用perl one liner为数字添加1000.这是我尝试过的:

perl -pi -e "s/ZZZ(\d+)ZZZ/ZZZ\1+1000ZZZ/e" file.txt
Run Code Online (Sandbox Code Playgroud)

我希望这会增加1000数字之间的数字ZZZ.但我收到错误消息:

Backslash found where operator expected at -e line 1, near "ZZZ\"
Bareword found where operator expected at -e line 1, near "1000ZZZ"
    (Missing operator before ZZZ?)
syntax error at -e line 1, near "ZZZ\"
Execution of -e aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

perl integer-arithmetic

-1
推荐指数
1
解决办法
193
查看次数

在C / C ++中乘以低数字(相对于高数字)是否更快?

问题示例:

计算123 * 456是否比计算123456 * 7890快?还是相同的速度?

我想知道32位无符号整数,但是我不会忽略其他类型(64位,有符号,浮点型等)的答案。如果不同,则有什么不同?这些位是否为0/1?

编辑:如果有所不同,我应该澄清一下,我指的是任何数字(两个低于100的随机数与两个高于1000的随机数)

c c++ optimization integer-arithmetic

-1
推荐指数
1
解决办法
214
查看次数

printf()内的整数运算

C编程新手.为什么下面这段代码的输出不是0 20 0,而是它1 20 0

printf ( "\n%d %d %d", x != 1, x = 20, x < 30 ) ;
Run Code Online (Sandbox Code Playgroud)

我的理解是代码将x分配给1以外的值(1 = true因此!= true为0)?有人能指引我完成逻辑吗?

c integer-arithmetic

-1
推荐指数
1
解决办法
73
查看次数

8051 16位加法/乘法结果16位而不是32位

我有个问题.在此程序中,变量x应设置为0x10000,但在两个操作中结果为0.

这不是主程序,而是查找错误原因的测试.我目前正在使用十六进制输入制作64位乘法器.我使用Keil和Proteus进行了16位乘法运算

int main() {
    unsigned long int x = 0;
    x = 0x8000 * 0x2;
    x = 0x8000 + 0x8000;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c 16-bit integer-promotion integer-arithmetic

-2
推荐指数
1
解决办法
443
查看次数

在C中向数字添加1

我必须在C中添加一个数字.我必须在没有像'+','++'等算术运算符的情况下这样做.

我写了以下代码行.

int a = 1234;
int b = 1;
printf("%d", a ^ b);
Run Code Online (Sandbox Code Playgroud)

这工作正常,直到达到整数限制,即,对于32位,它是4294967295.但我在许多其他网站中看到,执行相同的两个数字的AND,然后是XOR和左移.

请告知我的方法是否正确,因为我是C的新手.

c bitwise-operators integer-arithmetic

-5
推荐指数
1
解决办法
3606
查看次数