APr*_*mer 15
正如Code Monkey所引用的那样,它是实现定义的,实现方式各不相同 - 它不仅仅是BigEndian/LittleEndian和charset的区别.我已经使用该程序测试了四种实现(全部使用ASCII)
#include <stdio.h>
int main()
{
unsigned value = 'ABCD';
char* ptr = (char*)&value;
printf("'ABCD' = %02x%02x%02x%02x = %08x\n", ptr[0], ptr[1], ptr[2], ptr[3], value);
value = 'ABC';
printf("'ABC' = %02x%02x%02x%02x = %08x\n", ptr[0], ptr[1], ptr[2], ptr[3], value);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到了四个不同的结果
Big endian(AIX,POWER,IBM编译器)
'ABCD' = 41424344 = 41424344
'ABC' = 00414243 = 00414243
Run Code Online (Sandbox Code Playgroud)
Big endian(Solaris,Sparc,SUN编译器)
'ABCD' = 44434241 = 44434241
'ABC' = 00434241 = 00434241
Run Code Online (Sandbox Code Playgroud)
小端(Linux,x86_64,gcc)
'ABCD' = 44434241 = 41424344
'ABC' = 43424100 = 00414243
Run Code Online (Sandbox Code Playgroud)
小端(Solaris,x86_64,Sun编译器)
'ABCD' = 41424344 = 44434241
'ABC' = 41424300 = 00434241
Run Code Online (Sandbox Code Playgroud)
小智 8
我猜你可以在案例陈述中使用它,但我不推荐它.
'yes'是一个多字符常数.它的类型是int,它的值是依赖于实现的.就像你已经说过的那样,这取决于编译器.
所以 int foo = 'yes';
ARM,第2.5.2节,第9页:
"字符常量是用单引号括起来的一个或多个字符,如'x'."
稍后在同一页面上:
"多字符常量的类型为int.多字符常量的值取决于实现.例如,'AB'的值可以合理地预期为'A''B'和('A'<< 8)+'B '在三种不同的实现上.通常最好避免多字符常量."
和
引用ANSI C规范(C++尝试兼容):
3.1.3.4字符常量语义
整数charcter常量具有int类型[注意它在C++中具有char类型] ...包含多个字符的整数字符常量的值...是实现定义的.
在允许单字符常量的所有上下文中都允许使用多字符常量.
至于它们实际使用的位置,我已经看到使用多字符常量来创建清晰的唯一值的代码.例如,假设int是4个字节,'ABCD'和'EFGH'可能是不同的.(这不是语言所保证的;实现必须记录映射,但它不一定合理.)并且假设合理的映射,您可能会在目标代码中看到"ABCD"或"EFGH".这不是世界上最好的想法,但如果你不太关心可移植性,它可以工作.
顺便提一下,所有符合C的编译器都支持多字符常量(根据定义;不支持它们的编译器是不符合的).
| 归档时间: |
|
| 查看次数: |
19603 次 |
| 最近记录: |