相关疑难解决方法(0)

使用0xFFFFFFFF是一种可靠的方法来设置32位类型的所有位吗?

这个代码用Windows SDK编译:

UINT cFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);
Run Code Online (Sandbox Code Playgroud)

DragQueryFileW()这个签名在哪里:

UINT DragQueryFileW(HDROP, UINT, LPWSTR, UINT );
Run Code Online (Sandbox Code Playgroud)

UINT在SDK标题中的某处定义,如下所示:

typedef unsigned int UINT;
Run Code Online (Sandbox Code Playgroud)

对于平台int肯定是32位.像往常一样,类型UINT的意思是固定宽度独立于系统位度,所以如果必须在其他平台上重新编译相同的代码,那么在DragQueryFileW()某处重新实现的地方也会有相应的地图typedef,这将使UINT地图成为合适的32-位无符号类型.

现在有一个静态分析工具,着眼于0xFFFFFFFF不断并抱怨,这是一个不可移植的幻数和应使用-1来代替.虽然当然-1是好的和便携式的,但我不知道如何使用0xFFFFFFFF常量可能是一个问题,因为即使移植类型仍然是32位并且常量将是好的.

在这种情况下,是否使用0xFFFFFFFF而不是-1设置所有位安全和可移植?

c++ binary portability types bit-fields

6
推荐指数
2
解决办法
1755
查看次数

G++ 警告:缩小转换范围

我正在尝试从sourceforge 编译hosts3d,它确实可以编译,但会生成几个缩小错误。我不知道如何解决这个问题,但任何帮助将不胜感激。我怀疑我可以下载以前版本的编译器,我可能最终会这样做,但现在...... c++11

g++ -Wall -O2 -c -o src/glwin.o src/glwin.cpp src/glwin.cpp: 在成员函数 'int MyGLWin::AddInput(int, int, unsigned int, int, const char*, bool) 中': src/glwin.cpp:983:147:警告:在 { } 内将 'max' 从 'int' 缩小到 'unsigned int' 的转换在 C++11 中格式不正确 [-Wnarrowing] glin_obj glin = {GLWIN_INPUT ,lastWin,lower,names++,left,top,cwidth,strlen(text),(strlen(text)>cwidth?strlen(text)-cwidth:0),max};

//create input object, return name of input object
int MyGLWin::AddInput(int left, int top, unsigned int cwidth, int max, const char *text, bool lower)
{
  if (!lastWin) return -1;  //check parent window object exists
  glin_obj glin = {GLWIN_INPUT, …
Run Code Online (Sandbox Code Playgroud)

c++ gcc warnings narrowing c++11

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

为什么这两种方法将变量设置为全1会产生不同的结果?

我最近发现了将变量设置为C中的所有1的两种方法之间的差异.这是一个小代码示例,用于说明我的64位Linux系统上的奇怪行为.

// compile with `gcc -o weird_shift_behaviour weird_shift_behaviour.c`

#include <stdio.h>

int main(void){
    long long foo = 0;
    long long bar = 0;
    int i;
    puts("<foo> will be set to all 1s by repeatedly shifting 1 to the left and OR-ing the result with <foo>.");
    puts("<bar> will be set to all 1s by repeatedly OR-ing it with 1 and shifting <bar> to the left one step.");
    for(i=0;i<8*(int)sizeof(long long)-1;++i){
        foo |= (1<<i);
        bar = bar<<1 | 1;
        printf("<i>: %02d <foo>: %016llx <bar>: …
Run Code Online (Sandbox Code Playgroud)

c

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

设置int64_t中的所有位

从下面的代码我希望将x中的所有位设置为1,但不知何故只设置了前32位:

int64_t x = 0xFFFFFFFF;
x<<32;
x|=0xFFFFFFFF;
Run Code Online (Sandbox Code Playgroud)

注意:在每行之后打印x会产生4294967295(32位低位设置为1).此外,尝试使用numeric_limits<int64_t>::min()没有成功.我的问题是如何设置x中的所有位?使用RHEL5.5.

谢谢

c++ int64

4
推荐指数
2
解决办法
769
查看次数

使用size_t的正确形式(将-1作为默认值传递以获得最大大小)

我正在尝试向后解析文本文件.我已完成解析,现在我试图给我的函数一个限制,以便它不会读取我的整个5Mb-2Gb日志文件.我将这个限制作为size_t传递,我试图想办法默认限制来读取文件中的所有内容.

因为将-1传递给无符号类型将设置最高位,我假设这将意味着我得到size_t的最大大小.我想知道,这是不好的形式?此外,是否有更好的方法来实现我的目标.

c c++ unsigned

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

获取按位不为零的无符号整数的最大值

我正在尝试获取某个无符号整数类型的最大值,而不包含任何像<limits>. 所以我想我只是翻转无符号整数值 0 的位。

#include <iostream>
#include <limits>

int main()
{
    std::cout << (~0U) << '\n'; // #1
    std::cout << (std::numeric_limits< unsigned >::max()) << '\n'; // #2
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我对这些之间的细微差别不是很有经验。这就是为什么我要问使用第一种方法是否会发生某些意外行为或某些平台/架构问题。

c c++ bit-manipulation numeric-limits

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

-1和~0之间有什么区别?

标题真的说明了一切:减一和蒂尔达(一补)零之间有什么区别?

在讨论指定所有位都设置的位掩码的最佳方法时出现了这个问题.以下哪项更好?

int func(int value, int mask = -1) {
    return (value & mask);
}
Run Code Online (Sandbox Code Playgroud)

要么

int func(int value, int mask = ~0) {
    return (value & mask);
}
Run Code Online (Sandbox Code Playgroud)

是否还有其他任何用途?

更新:在stackoverflow.com/q/809227/34509上有关于此主题的类似讨论,我在之前的研究中遗漏了这个问题 .感谢Johannes Schaub指出它.

c++ bitmask ones-complement

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