C++ #定义为无符号字符
我想知道如何告诉编译器C++ #定义为无符号字符,c++,c,C++,C,我想知道如何告诉编译器#define是无符号字符。 如果定义一个字节,请执行以下操作: #define AACEESS_PSS 0x80 #define ACCESS_PSS ((unsigned char)0x80) 但是如果#define有更多的字节,该怎么办呢?? 例如: #define ACCESS_PSS {0x32,0xFD,0x6E,0x2D} 我需要此强制转换,用于分配#使用无符号字符定义 int main(){ unsigned char Response
#define
是无符号字符
。
如果定义一个字节,请执行以下操作:
#define AACEESS_PSS 0x80
#define ACCESS_PSS ((unsigned char)0x80)
但是如果#define
有更多的字节,该怎么办呢??
例如:
#define ACCESS_PSS {0x32,0xFD,0x6E,0x2D}
我需要此强制转换,用于分配#使用无符号字符定义
int main(){
unsigned char ResponseData[100];
for (int i = 0; i <4;i++0){
if (ResponseData[i+5]==ACCESS_PSS){ //how to do this???
cout<<5<<endl;
}
intmain(){
无符号字符响应数据[100];
对于(int i=0;i
响应数据[i+5]==访问PSS
在C中,不能将四个无符号字符
与单个相等运算符进行比较
您可以转换为uint32\u t,但它可能会由于未对齐的访问或不同的端号而中断,即:
#define ACCESS_PSS 0x32FD6E2D
...
if(*((uint32_t*) (ResponseData + i + 5)) == ACCESS_PSS) { /*...*/ }
唯一的清洁方法是memcmp
,或类似的功能:
const unsigned char access_pss[4] = {0x32,0xFD,0x6E,0x2D};
...
if(memcmp(ResponseData + i + 5, access_pss, 4) == 0) { /*...*/ }
响应数据[i+5]==访问PSS
在C中,不能将四个无符号字符
与单个相等运算符进行比较
您可以转换为uint32\u t,但它可能会由于未对齐的访问或不同的端号而中断,即:
#define ACCESS_PSS 0x32FD6E2D
...
if(*((uint32_t*) (ResponseData + i + 5)) == ACCESS_PSS) { /*...*/ }
唯一的清洁方法是memcmp
,或类似的功能:
const unsigned char access_pss[4] = {0x32,0xFD,0x6E,0x2D};
...
if(memcmp(ResponseData + i + 5, access_pss, 4) == 0) { /*...*/ }
响应数据[i+5]==访问PSS
在C中,不能将四个无符号字符
与单个相等运算符进行比较
您可以转换为uint32\u t,但它可能会由于未对齐的访问或不同的端号而中断,即:
#define ACCESS_PSS 0x32FD6E2D
...
if(*((uint32_t*) (ResponseData + i + 5)) == ACCESS_PSS) { /*...*/ }
唯一的清洁方法是memcmp
,或类似的功能:
const unsigned char access_pss[4] = {0x32,0xFD,0x6E,0x2D};
...
if(memcmp(ResponseData + i + 5, access_pss, 4) == 0) { /*...*/ }
响应数据[i+5]==访问PSS
在C中,不能将四个无符号字符
与单个相等运算符进行比较
您可以转换为uint32\u t,但它可能会由于未对齐的访问或不同的端号而中断,即:
#define ACCESS_PSS 0x32FD6E2D
...
if(*((uint32_t*) (ResponseData + i + 5)) == ACCESS_PSS) { /*...*/ }
唯一的清洁方法是memcmp
,或类似的功能:
const unsigned char access_pss[4] = {0x32,0xFD,0x6E,0x2D};
...
if(memcmp(ResponseData + i + 5, access_pss, 4) == 0) { /*...*/ }
从C99开始,我们就有了复合文字:
#define ACCESS_PSS (unsigned char const[]){0x32,0xFD,0x6E,0x2D}
您仍然可以将其用作访问\u PSS[2]
例如
定义中的常量
允许编译器进行优化,特别是它可以避免该数组的多个副本。因为C99我们有复合文本:
#define ACCESS_PSS (unsigned char const[]){0x32,0xFD,0x6E,0x2D}
您仍然可以将其用作访问\u PSS[2]
例如
定义中的常量
允许编译器进行优化,特别是它可以避免该数组的多个副本。因为C99我们有复合文本:
#define ACCESS_PSS (unsigned char const[]){0x32,0xFD,0x6E,0x2D}
您仍然可以将其用作访问\u PSS[2]
例如
定义中的常量
允许编译器进行优化,特别是它可以避免该数组的多个副本。因为C99我们有复合文本:
#define ACCESS_PSS (unsigned char const[]){0x32,0xFD,0x6E,0x2D}
您仍然可以将其用作访问\u PSS[2]
例如
定义中的const
允许编译器进行优化,特别是它可以避免该数组的多个副本被覆盖。您认为{0x32,0xFD,0x6E,0x2D}
类型为unsigned char
?提示:@SouravGhosh的答案是否定的。你能具体说明你所面临的概念问题吗?照目前的情况看,这个问题将一事无成。#define只是文本替换-编译器如何处理它将取决于你在代码中如何使用AACEESS#U PSS。看起来,甚至还没有说明。@EugeniuRosca这是因为这个问题是从programmers.se迁移过来的,她在那里有一个问题。你认为{0x32,0xFD,0x6E,0x2D}
类型为unsigned char
?提示:@SouravGhosh的答案是否定的。你能具体说明你所面临的概念问题吗?照目前的情况看,这个问题将一事无成。#define只是文本替换-编译器如何处理它将取决于你在代码中如何使用AACEESS#U PSS。看起来,甚至还没有说明。@EugeniuRosca这是因为这个问题是从programmers.se迁移过来的,她在那里有一个问题。你认为{0x32,0xFD,0x6E,0x2D}
类型为unsigned char
?提示:@SouravGhosh的答案是否定的。你能具体说明你所面临的概念问题吗?照目前的情况看,这个问题将一事无成。#define只是文本替换-编译器如何处理它将取决于你在代码中如何使用AACEESS#U PSS。看起来,甚至还没有说明。@EugeniuRosca这是因为这个问题是从programmers.se迁移过来的,她在那里有一个问题。你认为{0x32,0xFD,0x6E,0x2D}
类型为unsigned char
?提示:@SouravGhosh的答案是否定的。你能具体说明你所面临的概念问题吗?照目前的情况看,这个问题将一事无成。#define只是文本替换-编译器如何处理它将取决于你在代码中如何使用AACEESS#U PSS。看起来,甚至还没有说明。@EugeniuRosca这是因为这个问题是从programmers.se迁移过来的,她在那里有一个问题。很抱歉这么挑剔,但是使用干净的解决方案ACCESS\u PSS
必须是小写的ACCESS\u PSS
。值得一提的是,这个解决方案依赖于持久性。@barakmanos:哪个解决方案?memcmp不依赖,我已经注意到了使用uint32的帽子可能很危险。此外,您可能希望将该[4]
更改为[]
,并将另一个4
更改为sizeof(access\u pss)/sizeof(*access\u pss)
。如果目的只是字节比较,那么您是对的,Endianness在这里没有影响。很抱歉挑剔,但是使用干净的解决方案ACCESS\u PSS
必须是小写的ACCESS\u PSS
。值得一提的是,这个解决方案依赖于Endianness。@barakmanos:哪个解决方案?memcmp不依赖,我已经注意到了使用uint32可能是危险的。此外,您可能希望将该[4]
更改为[]
,并将另一个4
更改为sizeof(access\u pss)/sizeof(*access\u pss)
。如果目的只是字节比较,那么您是对的,Endianness在这里没有影响。很抱歉挑剔,但是使用干净的解决方案