在C/ c++中有一个简短的字节表示法吗?

Is there a shorthand byte notation in C/C++?

本文关键字:字节 表示 c++ 有一个      更新时间:2023-10-16

我用C/c++编程已经有一段时间了。对于我的生活,我不记得(或在谷歌上找到)如何使以下工作。我以为有一种写重复字节串的简写方式,就像这样:

0x00 => 0x00000000
0xFF => 0xFFFFFFFF
0xCD => 0xCDCDCDCD

例如,如果我要声明

int x = 0xCD;
printf("%d", x);

它将打印3452816845,而不是205

我疯了吗?

是否有可能不做运行时位移位(例如,通过使预处理器处理它)?

最简单的方法是:

0x1010101u * x

我想不出任何语法可能更简单或更不言自明…

Edit:我看到你想让它为任意类型工作。因为它只对无符号类型有意义,所以我假设您使用的是无符号类型。然后试着

#define REPB(t, x) ((t)-1/255 * (x))

在c中默认没有这样的东西,在CSS中也有类似的东西(颜色#123被扩展为#112233),但这是完全不同的。:)

您可以编写一个宏来为您做这件事,如:

#define REPEAT_BYTE(x) ((x) | ((x) << 8) | ((x) << 16) | ((x) << 24))
...
int x = REPEAT_BYTE(0xcd);

除非您自己编写宏,否则这是不可能的。它怎么知道要重复多长时间?0xAB可能意味着0xABABABABABABABABABABAB,因为它知道(使用提议的想法)。

没有这样的简写。0x00等于0。0xFF与0x000000FF相同

你可以使用一些模板技巧:

#include <iostream>
#include <climits>
using namespace std;
template<typename T, unsigned char Pattern, unsigned int N=sizeof(T)>
struct FillInt
{
    static const T Value=((T)Pattern)<<((N-1)*CHAR_BIT) | FillInt<T, Pattern, N-1>::Value;
};
template<typename T, unsigned char Pattern>
struct FillInt<T, Pattern, 0>
{
    static const T Value=0;
};
int main()
{
    cout<<hex<<FillInt<unsigned int, 0xdc>::Value<<endl; // outputs dcdcdcdc on 32 bit machines
}

自动适应作为第一个参数传递的整型,并在编译时完全解决,但这只是为了好玩,我认为我不会在实际代码中使用这样的东西。

没有。但是你可以使用memset:

int x;
memset(&x, 0xCD, sizeof(x));

你可以创建一个宏:

#define INITVAR(var, value) memset(&(var), (int)(value), sizeof(var))
int x;
INITVAR(x, 0xCD);

您可以使用预处理器标记连接:

#include <stdio.h>
#define multi4(a) (0x##a##a##a##a)
int main()
{
    int a = multi4(cd);
    printf("0x%xn", a);
    return 0;
}
结果:

0xcdcdcdcd

当然,每次要创建具有不同重复次数的"生成器"时,都必须创建一个新的宏。