标签: integer-overflow

如何在C中减去两个带符号的32位数时检测溢出?

我有两个有符号的整数,我想减去它们.我需要知道它是否溢出.

int one;
int two;
int result = two-one;

if (OVERFLOW) {
    printf("overflow");
} else {
    printf("no overflow");
}
Run Code Online (Sandbox Code Playgroud)

这样的事情.有没有办法做到这一点?

c integer-overflow

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

G ++允许在x64上进行隐式的long-to-int截断

我用g ++ -Wall编译这段代码,得到没有警告/错误:

#include "stdio.h"

int main() {
        long x = 1000000000000;
        int y = x;
        printf("%ld %d\n", x, y);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是人们所期望的:

1000000000000 -727379968
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,编译器是否应该阻止隐式转换/截断?

g++ (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42)
Run Code Online (Sandbox Code Playgroud)

c++ g++ overflow integer-overflow

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

C++为什么LLONG_MIN == -LLONG_MIN

在C++中如果我这样做:

__int64 var = LLONG_MIN;
__int64 var2 = -var;
cout << "var: "<< var << endl;
cout << "var2: "<< var2 << endl;
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

var: -9223372036854775808
var2: -9223372036854775808
Run Code Online (Sandbox Code Playgroud)

涵盖此标准的标准部分是什么?我假设它是有符号整数溢出.这是使用g ++(GCC)4.7.2编译的.

我有一个减法函数,我正在写一个添加函数,我想我可以这样做: add( someobj &obj, long long num ) { subtract( obj, -num ); }.我认为如果不是LLONG_MIN那会有用.

c++ signed integer-overflow long-long

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

无符号算术和整数溢出

我试图理解算术溢出.假设我有以下,

unsigned long long x;
unsigned int y, z;

x = y*z;
Run Code Online (Sandbox Code Playgroud)

y*z可能导致整数溢出.将其中一个操作数强制转换为unsigned long long可以缓解此问题.64位操作数与32位操作数相乘的预期结果是什么?

c c++ integer-overflow long-integer integer-arithmetic

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

C++整数溢出

我刚刚开始自学C++,并开始学习整数溢出.出于好奇,我写了一些测试,只是为了看看某些整数值会发生什么.

这是我的计划:

#include <iostream>

int main()
{
    int x(0);
    std::cout << x << std::endl;

    x = x + 2147483647;
    std::cout << x << std::endl;

    x = x + 1;
    std::cout << x << std::endl;
    std::cout << std::endl;

    unsigned int y(0);
    std::cout << y << std::endl;

    y = y + 4294967295;
    std::cout << y << std::endl;

    y = y + 1;
    std::cout << y << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

0
2147483647
-2147483648

0
4294967295
0
Run Code Online (Sandbox Code Playgroud)

输出让我感到有些惊讶,我想知道是否有人可以解释为什么会发生这种情况,或者如果这些结果出乎意料的话,这是预期的; 所以这可能只是我特定机器的结果.

c++ integer-overflow

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

计算百分比时出现意外结果 - 即使在分解整数除法规则时也是如此

我试图以百分比表示电池电压.我的电池电量是mV的(全局)uint16.我有一个16位CPU.这是我的代码:

static uint8 convertBattery(void){
    uint16 const fullBattery = 3000; /* 3V = 3000mV */
    uint8 charge;
    charge = ((battery*100)/fullBattery);
    return charge;
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我已经通过将分子乘以100得到了整数除法.

使用battery = 2756我的充电值计算出04意外的值.我花了很多时间在这个相当微不足道的任务上并没有取得任何进展.有人能说出问题出在哪里吗?

谢谢.

c integer-overflow integer-division percentage

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

CUDA大输入数组

我是CUDA的新手,我一直致力于"减少算法".

该算法适用于任何小于1 << 24的数组大小.

当我使用大小为1 << 25的数组时,程序在"总和"中返回0,这是错误的.总和应该是2 ^ 25

编辑 cuda-memcheck compiled_code

========= CUDA-MEMCHECK
@@STARTING@@ 
========= Program hit cudaErrorInvalidValue (error 11) due to "invalid argument" on CUDA API call to cudaLaunch. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib64/libcuda.so.1 [0x2f2d83]
=========     Host Frame:test [0x3b37e]
=========     Host Frame:test [0x2b71]
=========     Host Frame:test [0x2a18]
=========     Host Frame:test [0x2a4c]
=========     Host Frame:test [0x2600]
=========     Host Frame:test [0x2904]
=========     Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xfd) [0x1ed5d]
=========     Host Frame:test …
Run Code Online (Sandbox Code Playgroud)

c++ arrays cuda integer-overflow

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

为什么`128u8.checked_shl(1)`返回`Some(0)`?

我的印象是.checked_*(_)积分类型的方法有助于避免溢出.然而,该.checked_shl(u32)方法愉快地移出了上面示例的最后一点.

我的印象错了吗?那个方法什么?

(还想添加它以避免轮班溢出,可以检查是否((~0) >> rhs) >= self至少对于无符号类型)

integer-overflow rust

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

C#"积分常量太大" - 对于Int32类型,整数变量太大

我正在构建一个ASP.NET Core API,它返回太阳系中的周期表和行星.主要是使用API​​调用,以及.NET中的数据类型.在Visual Studio 2017中构建它.

我在行星的质量属性方面存在问题,以千克为单位.显然是一个大整数,所以我尝试将它声明为long,Ulong,Int64甚至UInt64.但是,当我尝试进入一个行星的新模型并放入质量时,我收到以下错误:

struct System.Int32
Represents a 32 bit signed integer.
Integral constant is too large.
Run Code Online (Sandbox Code Playgroud)

这是我正在描述属性的PlanetModel.cs:

...
public UInt64 Volume { get; set; } //In Kilometers
public Int64 Mass { get; set; } //In Kilograms
public float Gravity { get; set; } //In m/s^2
...
Run Code Online (Sandbox Code Playgroud)

然而,当我转移到我的PlanetDataStore.cs时,我正在尝试使用数据构建对象.

new PlanetModel()
                {
                    Position = 1,
                    Name = "Mercury",
                    Distance = 57909050, //In Kilometers
                    Orbit = 0.240846F, //In years
                    SolarDay = 0.5F, //In Days
                    Radius = 2439, //In Kilometers
                    Volume …
Run Code Online (Sandbox Code Playgroud)

c# asp.net integer integer-overflow

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

C和C++中整数计算的溢出

请检查以下代码段:

  unsigned char a = 100;
  unsigned char b = 100;
  unsigned char c = 100;
  unsigned short x = a * b + c;
Run Code Online (Sandbox Code Playgroud)

我预计这会溢出,计算将在8位类型的unsigned char(不是16位无符号short)中完成,超过unsigned char的值范围.但事实并非如此.

为什么计算不会在C和C++中溢出?

c c++ integer-overflow

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