我一直在尝试理解 C 编程中的整数溢出。我很困惑最终值输出是否取决于声明期间赋予变量的初始数据类型或用于打印变量的格式说明符。
`
int main() {
short int a = 32771;
printf("%d\n", a); // O/P : -32765
printf("%u\n\n", a); // O/P : 4294934531
int b = 32771;
printf("%hd\n", b); // O/P : -32765
printf("%hu", b); // o/p : 32771
return 0;
}
`
a 在一开始就被声明为短整数,但使用溢出短整数范围的值进行初始化。 printf("%d ", a) 语句给出将 a 视为有符号短整数(2 字节或 16 位)的输出,而 printf("%u ", a) 语句给出输出,将其视为无符号整数(4 字节或 32 位)
b 在一开始就被声明为整数(4 字节或 32 位),并使用整数范围内的值进行初始化。 printf("%hd ", b) 语句给出将 b 视为有符号短整数(2 字节或 16 位)的输出,而 printf("%hu", b) 语句给出将其视为无符号短整数的输出.
请解释这一差异。到底是什么决定了最终的输出值?
变量的类型在创建时决定。
当
printf()
解析他在字符串中找到 const char * format
的 %u
时,追加是什么。
这对他来说,他需要打印一个
unsigned int
,然后他将通过 va_arg()
调用来读取它。 (见人)
然后他通过
unsigned int
调用打印他创建的 write()
。
仅供参考:
溢出条件可能会产生导致意外行为的结果。特别是,如果没有预料到这种可能性,溢出可能会损害程序的可靠性和安全性。
如果您想深入了解位和溢出,您可以打印位:
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
void print_bits(short int x)
{
printf("%d : \n", x);
for (int16_t i = sizeof(x) * 8 - 1 ; i >= 0; i--)
{
printf("%d", (x >> i) & 1);
if (i % 8 == 0)
printf(" ");
}
printf("\n");
}
int main(void)
{
short int a = 32767;
print_bits(a);
a++;
print_bits(a);
return (0);
}
这给了我们类似的东西:
➜ RTFM ./a.out
32767 :
01111111 11111111
-32768 :
10000000 00000000