[英]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.