我试过执行以下程序:
#include <stdio.h>
int main() {
signed char a = -5;
unsigned char b = -5;
int c = -5;
unsigned int d = -5;
if (a == b)
printf("\r\n char is SAME!!!");
else
printf("\r\n char is DIFF!!!");
if (c == d)
printf("\r\n int is SAME!!!");
else
printf("\r\n int is DIFF!!!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于这个程序,我得到输出:
char是DIFF !!! int是相同的!
为什么我们两者都有不同的输出?
输出应该如下?
char是相同的!int是相同的!
一个键盘连接.
本文旨在用作关于C中隐式整数提升的常见问题解答,特别是由通常的算术转换和/或整数提升引起的隐式提升.
示例1)
为什么这会给出一个奇怪的大整数而不是255?
unsigned char x = 0;
unsigned char y = 1;
printf("%u\n", x - y);
Run Code Online (Sandbox Code Playgroud)
例2)
为什么这会给"-1大于0"?
unsigned int a = 1;
signed int b = -2;
if(a + b > 0)
puts("-1 is larger than 0");
Run Code Online (Sandbox Code Playgroud)
示例3)
为什么更改上例中的类型来short解决问题?
unsigned short a = 1;
signed short b = -2;
if(a + b > 0)
puts("-1 is larger than 0"); // will not print
Run Code Online (Sandbox Code Playgroud)
(这些示例适用于16位或短16位的32位或64位计算机.)
我目前正在为嵌入式系统(C 和 C++)编写一些代码,并且在尝试最小化内存使用时,我注意到我使用了很多依赖于整数提升的代码。例如(据我所知,这段代码在 c 和 c++ 中是相同的):
uint8_t brightness = 40;
uint8_t maxval = 255;
uint8_t localoutput = (brightness * maxval) / 100;
Run Code Online (Sandbox Code Playgroud)
因此,即使亮度 * 255 大于 uint8_t 中可以存储的值,如果我是正确的,由于整数提升,这仍然会产生正确的结果。亮度是一个百分比,因此它永远不应该高于 100,因此本地输出永远不应该高于 255。我的问题是是否有任何意外行为(例如亮度 * maxval 大于 255 因此有溢出)或任何显着差异c++ 和 c 之间如何处理这种语法就是这种情况。似乎只是输出正确的答案,或者更建议将变量设为 uint16_t 类型,因为中间计算可能高于 255,并且将内存损失视为理所当然。