c语言char和int8,关于数组:C中uint8和char之间的转换

我有一个API,可实现对EEPROM的写操作。 这是它的声明:

CYBLE_API_RESULT_T CyBle_StoreAppData (uint8 * srcBuff, const uint8 destAddr[], uint32 buffLen, uint8 isForceWrite);

当我调用此函数并将数组参数发送到已声明为uint8类型的srcBuff时,它工作得很好。

问题是,我需要向它发送char数组指针。 我以为char已经是uint8,但是如果我向该函数而不是uint8发送char数组指针,则会收到编译器警告。 为什么不能使用char代替uint8? 这是调用该函数的2个示例:

static const uint8      datastack_ROM[dedicatedRomSize] = {0};

uint8                   Container_ID[10];

char                    Prefix[10];

//Call the function with Container_ID which has been declared as uint8. This is working.

CyBle_StoreAppData(Container_ID,datastack_ROM,10,0);

//Call the function with Prefix which has been declared as char. This is NOT working.

CyBle_StoreAppData(Prefix,datastack_ROM,10,0);

这是第二个呼叫的警告:

passing char[10] to parameter of type 'uint8 *' converts between pointers to integer types with different sign.

char和uint8不一样吗?

错误消息中的重要内容是有关"不同符号"的部分。 这意味着您的char类型是signed,而uint8是(假设在这里)unsigned。 它可能不会成为一个大问题,所以您应该只应该可以投射指针:CyBle_StoreAppData((uint8 *) Prefix, ...)

请注意:这似乎违反了约束,请注意:stackoverflow.com/questions/30535814/

@GiorgiMoniava我已经寻找了类似的问题,但我想我找不到。 我该如何提一个类似的问题? 还是我需要这样做?

char和uint8都有共同点,这很重要:它们都是8位整数。现在两个问题

/这8位整数是带符号的还是无符号的?

更重要的是

您的情况重要吗?

即您是否要向函数发送一个由整数组成的数组,将其视为带符号的整数很重要?例如,如果函数将执行类似的操作,

if (charvalue < 0) { ...

或者如果您想让函数注意字节的有符号性(如果可能);或者如果函数能够做到这一点,那么符号就很重要:发送255是肯定的,但考虑到带符号的字节,则将其解释为-1 ...

但这是没有意义的,因为该函数需要uint8 *(实际上,在开发人员内部,开发人员可能已经使用char分别对待字节并使用其签名),但是在这种情况下,具有这样的函数签名将非常有用误导!)

因此,E2PROM正在处理无符号字节,您可以放心地将赋予函数的指针强制转换为删除警告,

CyBle_StoreAppData((uint8 *)Prefix,datastack_ROM,10,0);

或简单地

uint8  Prefix[10];

如果那不会导致其他问题/其他代码警告。

uint8                   Container_ID[10];

多数民众赞成在一个无符号的8位整数,可能的值从0到255

char                    Prefix[10];

您的情况是带符号的8位字符,其整数值从-127到+128

因为它们不是相同的符号类型,所以您会收到应有的转换警告。

两种类型均为8位长。区别在于签名。

uint8类型是无符号的。

char类型应根据您的情况进行签名。实际上,它依赖于编译器,但是大多数编译器默认将char类型视为带符号,并可以根据需要选择将char类型强制为无符号。请参阅C99标准文档参考§6.2.5p15:

The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char.

CHAR_MIN, defined in limits.h, will have one of the values 0 or SCHAR_MIN, and this can be used to distinguish the two options.

我不认为这是依赖编译器的。我找到了此链接。但是,如果我声明Container_ID为无符号,则无法使用将其用于其他作业的字符串函数。所以我应该像在@Joachims答案上一样投射它吗?

看到我的编辑,我添加了对C标准的引用。但是可以,您可以按照建议进行投放。

谢谢:)这是解释性的。我确认我的编译器已将其视为已签名。因此,我使用了强制转换操作,并且效果很好。谢谢你们。

@abdullahcinar您的链接仅指向特定的编译器和平台。 ARM的正常目标是将默认纯字符设置为unsigned。由于世界上ARM CPU的数量比PC多,所以说char通常是无符号的可能更正确!

uint8_t很可能被定义为无符号字符。

char是它自己的类型,其行为与带符号字符或无符号字符完全一样(请注意,这是三种不同的类型)。

在这种情况下,它的行为就像带符号的char一样,您会收到转换警告。

我不认为这是依赖编译器的。我找到了此链接。但是,如果我声明Container_ID为无符号,则无法使用将其用于其他作业的字符串函数。所以我应该像在@Joachims答案上一样投射它吗?

@abdullahcinar是的,您可以强制转换它,假设您的体系结构每字节有8位,并且二进制补码,几乎可以肯定。

是的,我检查了它的真实性。所以我可以继续。非常感谢所有对此问题有解答的人。

我非常确定,在这种情况下,即使在char是未签名的平台上,gcc也会发出"有区别的签名"转换警告。

@plugwash不,我可以为您引用标准。 char从字面上看与签名char或未签名char相同,只是它是自己的类型。 (请不要基于对我的主观感受而拒绝投票。昨天我只是在尝试帮助您并且犯了一个错误,您可以查看评论,对此我表示歉意。)

@plugwash我刚刚用-Wall -Wextra -Wconversion用gcc 5.1.0进行了检查,当char和int8_t的符号匹配时,它不给出警告,而当它们与我的答案不匹配时,它给出错误。这是一个实际的例子。理论方面在C11 6.2.5。,第15页中作了解释。我认为您所关注的内容无效。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值