相关疑难解决方法(0)

为什么无符号整数溢出定义了行为但是有符号整数溢出不是?

无符号整数溢出由C和C++标准很好地定义.例如,C99标准(§6.2.5/9)声明

涉及无符号操作数的计算永远不会过度流动,因为无法用结果无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.

但是,这两个标准都声明有符号整数溢出是未定义的行为.再次,从C99标准(§3.4.3/1)

未定义行为的一个示例是整数流上的行为

这种差异是否存在历史或(甚至更好!)技​​术原因?

c c++ integer-overflow undefined-behavior

197
推荐指数
4
解决办法
4万
查看次数

(x | y) - y 为什么不能简单地是 x 甚至是 `x | 0`

我正在阅读内核代码,并且在一个地方我看到了if语句中的一个表达式,例如

if (value == (SPINLOCK_SHARED | 1) - 1) {
         ............
}
Run Code Online (Sandbox Code Playgroud)

其中SPINLOCK_SHARED = 0x80000000是预定义的常量。

我想知道为什么我们需要(SPINLOCK_SHARED | 1) - 1- 用于类型转换目的?表达式的结果将是 80000000-- 与 0x80000000 相同,不是吗?然而,为什么 ORing 1 和 Subtracting 1 很重要?

有一种感觉,我想得到一些东西..

c bit-manipulation

47
推荐指数
3
解决办法
3862
查看次数

将int存储在C中的char缓冲区中,然后检索它

我正在编写一个套接字客户端 - 服务器应用程序,其中服务器需要向客户端发送一个大缓冲区,并且所有缓冲区都应该单独处理,所以我想将缓冲区长度放在缓冲区中,以便客户端可以读取数据长度从缓冲区和相应的过程.

要设置长度值,我需要将每个字节中的整数值除以一个字节,并将其存储在缓冲区中以通过套接字发送.我能够将整数分成四个部分,但在加入时我无法检索到正确的值.为了演示我的问题,我编写了一个示例程序,我将int分成四个char变量,然后将它连接回另一个整数.目标是加入后我应该得到相同的结果.

这是我的小程序.

#include <stdio.h>

int main ()
{
    int inVal = 0, outVal =0;
    char buf[5] = {0};

    inVal = 67502978;

    printf ("inVal: %d\n", inVal);

    buf[0] = inVal & 0xff;
    buf[1] = (inVal >> 8) & 0xff;
    buf[2] = (inVal >> 16) & 0xff;
    buf[3] = (inVal >> 24) & 0xff;

    outVal = buf[3];
    outVal = outVal << 8;
    outVal |= buf[2];
    outVal = outVal << 8;
    outVal |= buf[1];
    outVal = outVal << 8;
    outVal |= …
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation bit-shift

9
推荐指数
4
解决办法
2880
查看次数

绕过CBMC检测到的无符号加法溢出

CBMC在以下行中检测到可能的无符号加法溢出:

l = (t + *b)&(0xffffffffL);
c += (l < t);
Run Code Online (Sandbox Code Playgroud)

我同意第一行有可能出现溢出,但我正在处理CBMC无法查看的下一行的进位.如果有溢出,我设置进位1.所以,因为我知道这个,这就是我希望我的代码工作的方式,我想继续进行验证过程.那么,我怎么告诉CBMC忽略这个错误并继续前进呢?

c integer model-checking integer-overflow cbmc

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

整数溢出和操作顺序

我最近遇到了一个关于我的C++代码的问题让我想知道我是否对编译器对长操作有什么误解...看看下面的代码:

#include <iostream>

int main() {
    int i = 1024, j = 1024, k = 1024, n = 3;
    long long l = 5;
    std::cout << i * j * k * n * l << std::endl;  // #1
    std::cout << ( i * j * k * n ) * l << std::endl; // #2
    std::cout << l * i * j * k * n << std::endl;  // #3
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对我来说,在这3行中的任何一行中发生乘法的顺序是不确定的.但是,这是我认为会发生的事情(假设int是32b,long long是64b,它们都遵循IEEE规则): …

c++ operators multiplication associativity language-lawyer

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

为什么C++有签名和未签名

我正在学习C++来自专业的JavaScript多年来.我知道之间的区别signedunsigned,但我不知道我理解为什么他们甚至存在.是为了表演还是其他什么?

c++

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

程序中的运行时错误,应该将float转换为字节数组

我得到了一个浮点变量,想知道它的字节表示是什么.所以我去IDEOne 写了一个简单的程序来做到这一点.但是,令我惊讶的是,它会导致运行时错误:

#include <stdio.h>
#include <assert.h>

int main()
{
    // These are their sizes here. So just to prove it.
    assert(sizeof(char) == 1);
    assert(sizeof(short) == 2);
    assert(sizeof(float) == 4);

    // Little endian
    union {
        short s;
        char c[2];
    } endian;
    endian.s = 0x00FF; // would be stored as FF 00 on little
    assert((char)endian.c[0] == (char)0xFF);
    assert((char)endian.c[1] == (char)0x00);

    union {
        float f;
        char c[4];
    } var;
    var.f = 0.0003401360590942204;
    printf("%x %x %x %x", var.c[3], var.c[2], var.c[1], var.c[0]); // little …
Run Code Online (Sandbox Code Playgroud)

c c++ floating-point unions

0
推荐指数
2
解决办法
188
查看次数

我们可以对这些片段说些什么?

1.

a=a+b; b=a-b; a=a-b;
Run Code Online (Sandbox Code Playgroud)

2.

b=a+b-(a=b);
Run Code Online (Sandbox Code Playgroud)

这两个片段交换'a'和'b'的值而没有临时的第三个变量.请忽略第二个陈述的完整性质.第二个陈述是否优于第一个陈述?怎么样?我们可以说第二个是最优的,因为它的陈述较少吗?

c variables

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