您的位置:首页 > 编程语言 > C语言/C++

c语言 无符号数 结构体指针 整型提升

2017-12-21 22:18 323 查看

12月21日随笔

12月21日随笔
无符号数 unsigned

结构体指针

整型提升

关于编译顺序的问题

本文有后续详细讲解

无符号数 unsigned

它和普通的变量定义是一样的,只不过差别在于系统对这块内存空间的识别不同。在下例中给n传的实参是-1,在函数中以%d打印仍是-1.而以无符号数打印则是32位全1的二进制数转换的整数。

#include <stdio.h>
void func(unsigned int n){
printf("%d\n",n);      //-1
printf("%u",n);        //4294967295
}
int main(){

int a =-1;
func(a);
}


结构体指针

结构体实例使用 . 访问成员

结构体指针使用 -> 访问成员更为便捷

-> 其实执行了两步,首先解引用指针,然后作为实例访问结构体变量。

struct stu s;
struct stu* p = &s;
(*p).age = 9;
p->age = 9;


整型提升

例如

char a = 1;
char b = 127;
char c = a + b;
printf("%d %d",a + b, c);   // 128    -128(10000000)负零解析为-128


C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字 符和短整型操作数在使用之前被转换为普通整型,这种转换称为『整型提升』。

在上例中a和b都被提升为整型来参与运算,

a   = 00000000..00000001
b   = 00000000..01111111
相加   = 00000000..10000000         //128
//而保存在c中以后,最高位变成符号位
c   = 10000000             //-128


关于编译顺序的问题

c = (++a) + (++a) + (++a) ;


上述表达式在不同的编译器中编译结果是不尽相同的,仅从运算符优先级和结合型不能确定最终的值。比如上式不能知道在编译后到底是先执行完三个括号里的自加,还是先执行前两个括号然后相加再执行后一个括号。这种式子属于错误表达,没有研究的价值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言