相关疑难解决方法(0)

使用-1将所有位设置为true是否安全?

我已经看到这种模式在C&C++中使用了很多.

unsigned int flags = -1;  // all bits are true
Run Code Online (Sandbox Code Playgroud)

这是一个很好的便携式方法吗?或正在使用0xffffffff~0更好?

c c++ binary bit-fields

130
推荐指数
9
解决办法
3万
查看次数

签署C中的无符号转换 - 它总是安全吗?

假设我有以下C代码.

unsigned int u = 1234;
int i = -5678;

unsigned int result = u + i;
Run Code Online (Sandbox Code Playgroud)

什么隐式转换在这里怎么回事,这是代码为安全的所有值ui?(安全,从某种意义上说,即使此示例中的结果会溢出到某个巨大的正数,我也可以将其转换回int并获得真实的结果.)

c type-conversion

127
推荐指数
3
解决办法
16万
查看次数

如果我为无符号变量赋值为负值会怎样?

我很想知道如果我给无符号变量赋一个负值会发生什么.

代码看起来有点像这样.

unsigned int nVal = 0;
nVal = -5;
Run Code Online (Sandbox Code Playgroud)

它没有给我任何编译器错误.当我运行程序时,nVal分配了一个奇怪的值!是否可以将某个2的补码值分配给nVal

c++ unsigned signed integer type-conversion

73
推荐指数
3
解决办法
8万
查看次数

将负整数转换为较大的无符号整数

我遇到过执行以下转换的代码:

static_cast<unsigned long>(-1)

据我所知,C++标准定义了将有符号整数值转换为无符号整数类型时会发生什么(请参阅:如果我将一个负值分配给无符号变量,会发生什么?).

我在上面的代码中所关心的是源和目标类型可能是不同的大小,以及这是否会对结果产生影响.编译器会在转换之前扩大源值类型吗?它会转换为相同大小的无符号整数然后放大吗?或许还有其他什么?

用代码澄清,

int nInt = -1;
long nLong = -1; // assume sizeof(long) > sizeof(int)

unsigned long res1 = static_cast<unsigned long>(nInt)
unsigned long res2 = static_cast<unsigned long>(nLong);

assert(res1 == res2); // ???
Run Code Online (Sandbox Code Playgroud)

基本上,我应该担心像编写代码一样

static_cast<unsigned long>(-1L)
Run Code Online (Sandbox Code Playgroud)

过度

static_cast<unsigned long>(-1)
Run Code Online (Sandbox Code Playgroud)

c++ size casting

11
推荐指数
2
解决办法
8437
查看次数

以编程方式确定有符号整数类型的最大值

此相关问题是关于在编译时确定签名类型的最大值:

C问题:off_t(和其他有符号整数类型)的最小值和最大值

但是,我已经意识到在运行时确定有符号类型(例如time_toff_t)的最大值似乎是一项非常困难的任务.

我能想到的最接近解决方案的是:

uintmax_t x = (uintmax_t)1<<CHAR_BIT*sizeof(type)-2;
while ((type)x<=0) x>>=1;
Run Code Online (Sandbox Code Playgroud)

只要type没有填充位,这就避免了任何循环,但是如果type确实有填充位,则强制转换会调用实​​现定义的行为,这可能是信号或无意义的实现定义转换(例如,剥离符号位).

在我看来,我开始认为问题是无法解决的,这有点令人不安,并且会成为C标准的缺陷.证明我错的任何想法?

c signed overflow

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

测试模板参数的签名

我需要掩盖一些值的前导位.如果该值是无符号的,我可以断言(保证)没有设置任意数量的前导位,即保证该值是有限的.

如果签名,我需要掩盖前导位(将值转换为一些不可移植的位,是的,我知道这一点:-)).如果值是无符号的,我想保存屏蔽操作.

所以我基本上有

template<typename T, some more template parameters>
class {
    unsigned transform(T value) {
        ...
        if (isSigned(T)) {
            value &= mask;
        }
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以编写一个isSigned(),它可以在编译时进行评估(以使优化器能够删除未签名的死代码)?

当然我可以添加另一个模板参数......

c++ templates

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