C语言类型转换与原型申明

C语言类型转换与原型申明

关于整型字面值

字面值这个术语是字面常量值的缩写,指定了自身的值,并且不允许发生改变。当有一程序内出现整形字面值时,它是属于整型家庭9种不同类型中的哪一种呢?这取决于如何书写,例如下整型字面值后添加字符L(长整型)、U(无符号整型)。另外,字符常量(例:’M’、’\377’)的类型总是int。

类型转换

c语言中类型转换比一般人想象的要广泛得多。在涉及类型小于int或double的表达式中都可能发生转换。下面程序执行结果是4。

printf("%d",sizeof ‘A‘);

c语言中类型提升:

源类型 通常提升后的类型
char int
位段(bit-field) int
枚举 int
unsigned char int
short int
unsigned short int
float double
任何数组 相应类型的指针


注意:由于函数参数也是表达式,也会发生类型提升。ANSI C中,如果使用了适当的函数原型,类型提升不会发生,否则也会发生。在被调用函数的内部,提升后的参数被裁剪为原先声明的大小。



为了避免类型提升可能带来的一些不便,我们在定义一个函数以后,规范做法是要对该函数进行申明,如果不申明,可能会导致一些不可预测的问题。例如:

lib.c
#include<stdio.h>
void myprintf(float a, char b)
{
    printf("float=%f, char=%c \n", a, b);
}

main.c
#include<stdio.h>
void main()
{
    float a = 12.3;
    char b = 33;
    myprintf(a, b);
}

上面代码中有两个文件,lib.c和main.c, 在main.c中隐式调用了myprintf(),由于没有声明该函数,此时编译器就会对实参a进行类型提升变成double,在函数内部,提升后的参数又被裁剪为float大小。最后,实际输出是:

float=-0.000000, char=!

为了不出现这种错误,应该编写一个.h应文件对函数进程声明,从而保证不发生不期望的类型提升。

时间: 2024-09-30 17:05:04

C语言类型转换与原型申明的相关文章

GO语言学习(十七)Go 语言类型转换

Go 语言类型转换 类型转换用于将一种数据类型的变量转换为另外一种类型的变量.Go 语言类型转换基本格式如下: type_name(expression) type_name 为类型,expression 为表达式. 实例 以下实例中将整型转化为浮点型,并计算结果,将结果赋值给浮点型变量: package main import "fmt" func main() { var sum int = 17 var count int = 5 var mean float32 mean =

C语言---类型转换

itoa 功 能:把一整数转换为字符串 用 法:char *itoa(int value, char *string, int radix); 详细解释:itoa是英文integer to array(将int整型数转化为一个字符串,并将值保存在数组string中)的缩写. 参数: value: 待转化的整数. radix: 是基数的意思,即先将value转化为radix进制的数,范围介于2-36,比如10表示10进制,16表示16进制. * string: 保存转换后得到的字符串. 返回值:

Unity中 Plugin 跨语言 类型转换

Unity 支持Plugin ,有一些代码我们可以用C++ 来编写成 Plugin 供C#调用,但是对于不同语言之间的类型转换就会很纠结.比如说 C# 里面的 string 到C++ 里面是什么?C++里面的string到C#里面是什么? 引自Unity官方的例子 C++咯平台代码如下: Win32/64 #if _MSC_VER // this is defined when compiling with Visual Studio #define EXPORT_API __declspec(

用通俗易懂的语言介绍JavaScript原型

原型(prototype)是每个JavaScript开发人员必须理解的基本概念,本文的目标是通俗而又详细地解释JavaScript的原型.如果你读完这篇博文以后还是不理解JavaScript的原型,请将你的问题写在下面的评论里,我本人会回答所有的问题. 为了理解JavaScript中的原型,你必须理解JavaScript的对象.如果你对对象还不熟悉,你需要阅读我的文章JavaScript Objects in Detail(译文:详解JavaScript对象).而且你要知道属性就是函数中定义的变

Go语言中调用C语言----类型转换篇

1. 基本类型转换较简单,直接用强制类型转换就可以,如下: Go转换成C: var i int ci := C.int(i) C转换成Go: var i C.int goi := int(i) 2. 字符串类型转换也不是很难,有一点需要注意,就是在将C语言中的char数组转换成Go的string时需要做一点小修改,如下: Go转换成C: var str string cstr := C.CString(str) C转换成Go: /* #include <stdlib.h> #include &

C语言类型转换

int/float to string/array: C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明. itoa():将整型值转换为字符串. ltoa():将长整型值转换为字符串. ultoa():将无符号长整型值转换为字符串. gcvt():将浮点型数转换为字符串,取四舍五入. ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点. fcvt():指定位数为转换精度,其余同ecvt(). 除此外,还可以

Go语言类型转换库【github.com/demdxx/gocast】的用法

一.导入库: go get github.com/demdxx/gocast 二.测试代码: // main.go package main import ( "fmt" "reflect" "github.com/demdxx/gocast" ) type AccessRegion struct { region_id int64 `tag:"RegionId"` provider_id int64 `tag:"P

Delphi与C语言类型转换对照

When converting C function prototypes to Pascal equivalent declarations, it's important to substitute the C function and argument types with the correct Pascal types. I often use a Type Translation Table for this, like the following in table 1 (optio

c语言不寻常的类型转换(类型提升)

对于一下代码: printf("%d",sizeof('A')); 你确定他打印的是1吗? 运行之后发现结果是 4 ! C语言 类型转换比一般人想像的还要多,在涉及小于int 和 double 的表达式中 , 都有可能出现类型转换! 根据提升规则:它由char 转换成为 int .这个特性叫做类型提升 ! char c1,c2; ........... c1=c1+c2; 下表给出了常见的类型提升的列表: char -------------------------> int 枚