c++ - 在针对64位变量的文字整数上使用NOT(〜)运算符时是否需要类型转换

标签 c++ c type-conversion

如果不能,以下哪种方法可以工作,如果不能的话,自动类型转换的规则是什么?

uint64_t u64val=3293;
#define ALIGNsize 4
u64val=(u64val+ALIGNsize-1)&~(ALIGNsize-1);
还是这是必需的:
uint64_t u64val=3293;
#define ALIGNsize 4
u64val=(u64val+ALIGNsize-1)&~((uint64_t)ALIGNsize-1);
如果是更高版本,是否有任何技巧可以使事情自动化,从而在使用32位时不会浪费,但仍可以在64位上工作而无需记住或知道数据大小?

最佳答案

我进行了测试,并使用NOT(〜)进行了比对,我想我想到了一些通用的方法。适用于C和C++(在C++中测试)。这里是示例应用程序。这是好事还是我错过了什么(想确保在被接受为答案之前):

// TestAlign.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <stdint.h>
#include <stdio.h>
#include <tchar.h>

// alignment to a base2 factor

inline uint64_t AlignUp2(uint64_t value, int align)
{
  return (value+align-1)&~((uint64_t) align-1);
}

inline uint32_t AlignUp2(uint32_t value, int align)
{
  return (value+align-1)&~((uint32_t) align-1);
}

#define ALIGNUP232(value, align) ((value+align-1)&~((uint32_t) align-1))
#define ALIGNUP264(value, align) ((value+align-1)&~((uint64_t)align-1))
#define ALIGNUP2(value, align) ((sizeof(value)==4) ? ALIGNUP232(value, align) : ALIGNUP264(value, align))
 
int _tmain(int argc, TCHAR *argv[])
{
  if (argc<3) {
    _tprintf(_T("Usage: testgenericitems value alignvalue\n"));
    return 1;
  }

  uint64_t val64=_tcstoull(argv[1], NULL, 0);
  uint32_t val32=_tcstoul(argv[1], NULL, 0);

  uint32_t align=_tcstoul(argv[2], NULL, 0);

  uint32_t val32test;
  val32test=val32;
  val32test=(val32test+align-1) & ~(align-1);

  uint64_t val64test;
  val64test=val64;
  val64test=(val64test+align-1) & ~(align-1);

  _tprintf(_T("32bit Old Style Align %u up to multiple of %i = %u\n"), val32, align, val32test);
  _tprintf(_T("64bit Old Style Align %llu up to multiple of %i = %llu\n"), val64, align, val64test);

  val32test=val32;
  val32test=AlignUp2(val32test, align);

  val64test=val64;
  val64test=AlignUp2(val64test, align);

  _tprintf(_T("32bit c++ Align %u up to multiple of %i = %u\n"), val32, align, val32test);
  _tprintf(_T("64bit c++ Align %llu up to multiple of %i = %llu\n"), val64, align, val64test);

  val32test=val32;
  val32test=ALIGNUP2(val32test, align);

  val64test=val64;
  val64test=ALIGNUP2(val64test, align);

  _tprintf(_T("32bit c Align %u up to multiple of %i = %u\n"), val32, align, val32test);
  _tprintf(_T("64bit c Align %llu up to multiple of %i = %llu\n"), val64, align, val64test);

  return 0;
}

关于c++ - 在针对64位变量的文字整数上使用NOT(〜)运算符时是否需要类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62723079/

相关文章:

C++:将字节数组序列化为十六进制字符串

c - glibc 检测到双重释放或损坏

c# - 为什么我的转换/转换失败?

c - SSE 将 unsigned char 加载为 short

Javascript:转换代码字符串并返回

c++ - boost::smart_ptr 的内部结构

c++ - Input String 应该是 Integer - C++

c++ - 所有类实例方法的打印语句最后都打印出来了?

c - 如何正确地将程序参数 *char 转换为 int?

c++ - binary_log_types.h : No such file or directory