我有以下代码
int i = 321;
char ch = i;
printf("%d", ch);
Run Code Online (Sandbox Code Playgroud)
i在二进制是00000000 00000000 00000001 01000001和输出是65.从上面的代码中,我知道由于char只占用1个字节的内存,所以前3个字节i被删除,最后一个字节被分配给ch.因此结果.
我的机器是小端的.结果是ch基于底层机器的字节顺序吗?请澄清.
引用C11,6.3.1.3:
1当具有整数类型的值转换为除_Bool之外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变.
2否则,如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.
3否则,新类型已签名且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号.
标准仅涉及价值观.所以如果char是无符号的:321-256 = 65.如果char已签名,则行为是实现定义的.