本文旨在用作关于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位计算机.)
我有一个使用gcc版本4.6.3的项目,我被迫使用"-Wall -Werror -Wconversion"进行编译.以下简单示例显示了我无法摆脱的错误:
#include <stdint.h>
int main(void) {
uint32_t u = 0;
char c = 1;
u += c;
return (int)u;
}
Run Code Online (Sandbox Code Playgroud)
用上面的标志编译它给出:
test.c:7:8: error: conversion to ‘uint32_t’ from ‘char’ may change the sign of the result [-Werror=sign-conversion]
Run Code Online (Sandbox Code Playgroud)
好的.只需添加一个类型转换,对吗?不.将第7行更改为u += (uint32_t)c不会使错误消失.即使改变它u = u + (uint32_t)c也不会让它消失.
有可能解决这个问题吗?
请注意,"char"来自字符串,因此我无法更改其类型.
我虽然说,如果我cast有一个像这样的数字(unsigned char)32,就足以解决编译器的警告,但这并不是我的计划。
在这里,我有程序的以下部分,实际上解释了这个问题:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
char *ptr = malloc(6);
const char *name = "MICHI";
unsigned int i = 0;
if(ptr){
strcpy(ptr, name);
ptr[strlen(ptr)] = '\0';
}else{
return 1;
}
while(ptr[i] != '\0'){
if((ptr[i] >= 'A') && (ptr[i] <= 'Z')){
ptr[i] += (unsigned char)32;
}
i++;
}
printf("Name = %s\n",ptr);
if(ptr){
free(ptr);
ptr = NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在打开编译器警告的情况下对其进行编译时,得到以下信息:
error: conversion to ‘char’ from ‘int’ may alter its value [-Werror=conversion]|
Run Code Online (Sandbox Code Playgroud)
这意味着以下内容ptr[i] …