对于正在开发的软件,我有两种构建方式,一种是针对int大小为16位的嵌入式系统,另一种是针对int大小为32位的台式机进行测试。我使用的是固定宽度的整数类型<stdint.h>,但整数提升规则仍取决于int的大小。
理想情况下,由于整数提升,我希望打印以下代码65281(将整数提升为16位)而不是4294967041(将整数提升为32位),以使其与嵌入式系统上的行为完全匹配。我要确保在台式机测试期间给出一个答案的代码与嵌入式系统上给出的答案完全相同。对于GCC或Clang的解决方案都可以。
#include <stdio.h>
#include <stdint.h>
int main(void){
uint8_t a = 0;
uint8_t b = -1;
printf("%u\n", a - b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我给出的示例可能不是最好的示例,但是我确实希望整数提升为16位而不是32位。请看以下示例:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main(void){
uint16_t a = 0;
uint16_t b = 1;
uint16_t c = a - 2; // "-2": 65534
uint16_t d = (a - b) / (a - c);
printf("%" PRIu16 "\n", d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是0在32位系统上,这是因为在提升为(signed)int而不是后从整数除法截断了32767。
到目前为止,最好的答案似乎是使用仿真器,这不是我想要的,但是我认为确实是有道理的。从理论上来说,编译器似乎可以生成行为,就像int的大小为16位一样,但是我想实践中没有简单的方法可能并不奇怪,对这种模式和任何必要的运行时支持的需求可能不大。
编辑2: …