以下代码编译得很好:
uint32_t myfunc32() {
uint32_t var = 'asdf';
return var;
}以下代码给出警告,“字符常量对其类型来说太长了”:
uint64_t myfunc64() {
uint64_t var = 'asdfasdf';
return var;
}实际上,64位字符文字被GCC截断为32位常量.64位字符文字不是C的特性吗?我找不到任何关于这个的好消息。
编辑:我正在做更多的测试。事实证明,另一个编译器MetroWerks CodeWarrior可以像预期的那样编译64位字符文本。如果这还不是GCC的一个特征的话,那就应该是这样的。
发布于 2021-08-11 06:13:26
64位字符文字不是C的特性吗?
事实上,事实并非如此。根据C99§6.4.4.4点10 (第73页这里):
整数字符常量具有
int类型。包含映射到单字节执行字符的单个字符的整数字符常量的值是映射字符表示为整数的数值。包含多个字符(例如'ab')的整数字符常量的值,或者包含不映射到单字节执行字符的字符或转义序列的值,都是实现定义的。
因此,字符常量具有int类型,在大多数现代平台上这意味着int32_t。另一方面,由多字节字符常量产生的int的实际值是由实现定义的,因此,除非您针对特定的编译器和编译器版本,否则您不会对int x = 'abc';期望太高。您应该避免在正常的C代码中使用这样的语句。
根据GCC的具体行为,从GCC的文献有:
预处理表达式中字符常量的数值。预处理器和编译器以同样的方式解释字符常量;例如,转义序列(如
‘\a’)会给出它们在目标机器上的值。 编译器一次计算一个多字符字符常量--一个字符,移动每个目标字符的位数所留下的先前值,然后将新字符的位模式截断为目标字符的宽度。最后的位模式给出了int类型,因此是有符号的,不管单个字符是否有符号。如果常量中的字符比目标int中的字符多,编译器会发出警告,过多的前导字符将被忽略。。 例如,具有8位字符的目标的'ab'将被解释为‘(int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')’,而'\234a'将被解释为‘(int) ((unsigned char) '\234' * 256 + (unsigned char) 'a')’。
https://stackoverflow.com/questions/68736707
复制相似问题