测试小结

1.c语言--回绕

C语言是一种弱类型的语言,类型之间可以进行隐式的转换;而C++是强类型的语言,需要进行强制类型转换

C99规定(无符号整数将会回绕):涉及无符号操作数的计算不会溢出,因为无法由最终的无符号整数类型表示的结果将会根据这种最终类型可以表示的最大值加1执行求模操作。

如:
unsigned int i = -1;
输出的时候,i 的值为:4294967295(最大值)
i的值有一个循环:
0 1 2 3... 4294967295   0 1 2 ... 4294967295...
如果溢出了,就回到循环的开头。

------------------------------------------------------------------------------------------------------------------------------

在有符号数中,最小值-1=最大值,最大值+1=最小值;无符号最小值-1=最大值,最大值+1=0。我们称之为回绕wrap around。现在来说一般建议避免,因为其他架构的CPU,发生整数溢出时可能会触发CPU异常。

造成无符号整数运算回绕的操作符有“+”、“-”、“*”、“++”、“–”、“+=”、“-=”、“*=”、“<<=”、“<<”等。

为什么最小值-1=最大值。这要从计算机内部数字表示形式开始,都是采用补码表示。

2.c语言--整数提升

1、默认参数提升:如果一个函数的形参类型未知,那么调用函数时要对相应的实参做“整数提升(integer promotions)”,除此以外,float类型的参数会被提升为double。
2、如果形参和实参个数不相等的时候,行为未定义;
3、 如果函数定义的时候指定参数原型,那么a)参数原型包含(...),即变参;b)形参类型和实参类型不符合。这两种行为都是未定义的;
4、 如果函数定义的时候不指定参数原型,如果提升后的实参类型和形参类型不相符,则行为未定义;除了两种情况a)提升后一个是unsigned int一个是signed int,则值可以被表示成这两种的任何形式;b)实参或形参都是指针,分别指向限定和非限定(如const)的char或者void。

Paragraphs7
1、 如果一个函数的形参类型已知,则实参的类型会被隐式的转换成形参的类型,并且转换成非限定的对应类型;
2、如果函数原型中有(...)参数,那么对应的实参会被进行默认参数提升;

简单来说,以上标准可以归结为两点:

1、对于有参数原型的函数(非变参),实参会被隐式转换成相应的实参的类型;

2、对于没有参数原型的函数或者变参函数,实参会被进行“默认参数提升”

------------------------------------------------------------------------------------------------------------------------------

①    C标准对默认实际参数提升规则有明确规定。
也就是说, 带有可变长参数列表的函数, 绝对不会接受到char类型的实际参数。

②    C标准对va_arg是否自动对齐没有任何说明

也就是说自动对齐工作,编译器可做可不做。

在所有C实现上,能保证第①点,不能保证第②点,所以尽管编译器实现了自动对齐,也要按标准来。

3.c语言--整型提升

    1). 只要一个表达式中用到了整型值,那么类型为char、short int活整型位域(这几者带符号或无符号均可)的变量,以及枚举类型的对象,都可以被放在这个整型变量的位置。
    2). 如果1)中的变量的原始类型值域可以被int表示,那么原值被转换为int;否则的话,转为unsigned int。
   
    以上两者作为一个整体,被成为整型提升(Integral promotion)
 

总结:整型提升(integral promotion)只会发生在算术运算时

printf( "%d",sizeof ('A') ) sizeof ('A') 应该没有整型提升,而是在C中'A'为int型,sizeof ('A')=4;而在c++中sizeof ('A')=1

printf("helloword: %d %d\n",sizeof('A'),sizeof(char));

[1025@ubuntu]$ gcc secureCoding.c  && ./a.out
helloword: 4 1
[1025@ubuntu]$ g++ secureCoding.c  && ./a.out
helloword: 1 1

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值