簡體   English   中英

在針對 64 位變量的文字 integer 上使用 NOT (~) 運算符時是否需要類型轉換

[英]Is type casting needed when using NOT (~) operator on a literal integer against a 64bit variable

如果不是自動類型轉換的規則阻止它工作,以下工作是否有效?

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 位下工作,而無需記住或知道數據大小?

我做了一個測試,就 alignment 使用 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM