考虑以下程序:
#include <stdio.h>
#include <stdint.h>
int main()
{
uint16_t result;
uint16_t ui = 1;
int16_t si = -1;
result = si * ui;
printf("%i", result);
return 0;
}
这将打印值 65535,这是我阅读完这篇文章后所期望的:
si
转换为 ui
,因此将 max+1 添加到其中。现在,在下一个代码片段中,我将结果类型更改为uint_fast16_t
。
#include <stdio.h>
#include <stdint.h>
int main()
{
uint_fast16_t result;
uint16_t ui = 1;
int16_t si = -1;
result = si * ui;
printf("%li", result);
return 0;
}
现在,结果是
-1
。这里会发生什么?结果如何签名?
请参阅下面的代码(正如@Tom Karzes所说,
uint_fast16_t may be an ordinary unsigned int on some systems. In that case, %lu would be the wrong format.
我改变了我的答案):
#include <stdio.h>
#include <stdint.h>
int main()
{
uint_fast16_t result;
uint16_t ui = 1;
int16_t si = -1;
result = si * ui;
printf("sizeof(result) is %zu\n", sizeof(result));
printf("%li\n", result);
printf("%ld\n", result);
if(4 == sizeof(result)){
printf("%u\n", result);
}else if(8 == sizeof(result)){
printf("%lu\n", result);
}
return 0;
}
运行它会输出(在64位计算机上):
sizeof(result) is 8
-1
-1
18446744073709551615
为什么相同的
result
输出不同?一个是 %li,另一个是 %lu。
因为这取决于你如何看待它,如
unsigned
或signed
。