无符号整数溢出由C和C++标准很好地定义.例如,C99标准(§6.2.5/9)声明
涉及无符号操作数的计算永远不会过度流动,因为无法用结果无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.
但是,这两个标准都声明有符号整数溢出是未定义的行为.再次,从C99标准(§3.4.3/1)
未定义行为的一个示例是整数流上的行为
这种差异是否存在历史或(甚至更好!)技术原因?
我正在阅读内核代码,并且在一个地方我看到了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 很重要?
有一种感觉,我想得到一些东西..
我正在编写一个套接字客户端 - 服务器应用程序,其中服务器需要向客户端发送一个大缓冲区,并且所有缓冲区都应该单独处理,所以我想将缓冲区长度放在缓冲区中,以便客户端可以读取数据长度从缓冲区和相应的过程.
要设置长度值,我需要将每个字节中的整数值除以一个字节,并将其存储在缓冲区中以通过套接字发送.我能够将整数分成四个部分,但在加入时我无法检索到正确的值.为了演示我的问题,我编写了一个示例程序,我将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) CBMC在以下行中检测到可能的无符号加法溢出:
l = (t + *b)&(0xffffffffL);
c += (l < t);
Run Code Online (Sandbox Code Playgroud)
我同意第一行有可能出现溢出,但我正在处理CBMC无法查看的下一行的进位.如果有溢出,我设置进位1.所以,因为我知道这个,这就是我希望我的代码工作的方式,我想继续进行验证过程.那么,我怎么告诉CBMC忽略这个错误并继续前进呢?
我最近遇到了一个关于我的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++来自专业的JavaScript多年来.我知道之间的区别signed和unsigned,但我不知道我理解为什么他们甚至存在.是为了表演还是其他什么?
我得到了一个浮点变量,想知道它的字节表示是什么.所以我去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) 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'的值而没有临时的第三个变量.请忽略第二个陈述的完整性质.第二个陈述是否优于第一个陈述?怎么样?我们可以说第二个是最优的,因为它的陈述较少吗?