对于下面的代码,我得到了一个溢出,但不幸的是,我似乎不能理解为什么。
std::int8_t smallValue = -1;
unsigned int value = 500;
std::uint8_t anotherSmallValue = 1;
auto test = smallValue * value * anotherSmallValue;
之后,test是一个相当大的值。
有人能解释一下,这里发生了什么吗?
考虑以下代码:
#include <iostream>
static constexpr uint8_t a = 0x80;
static constexpr uint8_t b = ~a;
它产生以下警告:
<source>:5:30: warning: implicit conversion from 'int' to 'const uint8_t' (aka 'const unsigned char') changes value from -129 to 127 [-Wconstant-conversion]
我不知道当我使用未签名的字符时,我什么时候要担心溢出。这个案件是明确的:
uint8_t a = 3;
uint8_t b = 6;
uint8_t c = a - b; // c is 253
然而,这里发生了什么:
float d = a - b; // d is -3
在减法之前,a和被转换成浮点数吗?
或者在这种情况下:
float e = (a - b) + (a - c);
这三个变量都转换成浮点数了吗?
是否有可能发生溢出,即使分配给的变量是浮点数?如果e是浮点、整数或其他任何东西,规则是相同的吗?
同样,在这种情况下会发生什么:
int a = std::abs(a - b)
a + b像我所期望的那样将255溢出到4,然后c / 2给出了我预期的2。但是,为什么最后一个例子在计算相同的两个步骤时不溢出呢?
我猜内部计算值是用更多位存储的,然后在执行赋值时只截断到8位。在这种情况下,极限在哪里,它必须在某个点溢出?
uint8_t a = 250;
uint8_t b = 10;
uint8_t c = (a + b);
uint8_t d = c / 2;
uint8_t e = (a + b) / 2;
std::cout << unsigned(c) << ", " << unsigned(d) <&
编译以下代码
// foo.c
typedef unsigned char uint8_t;
int main() {
uint8_t a = 1;
uint8_t b = 10;
uint8_t c = 12;
uint8_t k = a + b + c;
}
使用GCC 11.2 (也是其他GCC版本),命令如下:
gcc -Wconversion foo.c
下列警告的结果:
Output of x86-64 gcc 11.2 (Compiler #3)
<source>: In function 'main':
<
static_cast不保护它被转换成的类型(即Values )不受无效值的影响吗?
如果是这样的话,打印铸造的价值不是个好主意?如何确保打印仅在值正确/有效时发生?
enum class Values : uint8_t
{
One,
Two
};
void bar(uint8_t value)
{
Values val = static_cast<Values >(value);
printf ("The received value = %u\n", val);
switch(val)
{
我有两个相关的问题:
当谈到x*y == z (或x+y == z)的算术表达式之间的比较时,标准说明了什么,以及不同编译器做了什么,其中x*y太大,x或y不能容纳,但不大于z。
如何比较具有相同基础二进制值的相同宽度的有符号整数和无符号整数?
下面的例子可以说明我的意思。
#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main (void)
{
uint8_t x = 250;
uint8_t y = 5;
uint16_t z = x
考虑一下( msvc15和16,即VisualStudio2017和2019)对Xeon 15的看法:
int main()
{
unsigned int x;
uint8_t val;
float f;
x = _status87(); // x = 0 here, OK
f = -1.00e+9;
x = _status87(); // x = 0 here, OK
val = uint8_t(f); // val = 0 here, I can live with that
x = _status87();
我不能溢出bool变量变成零。bool类型的变量有一个字节长,所以我认为当变量存储在256个时它会溢出,但这与我所期望的不一样。
#include<iostream>
int main()
{
bool b = 0;
std::cout << sizeof(b) << std::endl; // the result is 1 byte
std::cout << b << std::endl; // the result is 0
b = 256;
std::cout <<