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

来源:互联网 发布:太祖军事能力知乎 编辑:程序博客网 时间:2024/05/17 09:07

12月21日随笔

无符号数 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..00000001b   = 00000000..01111111相加   = 00000000..10000000         //128//而保存在c中以后,最高位变成符号位c   = 10000000             //-128

关于编译顺序的问题

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

上述表达式在不同的编译器中编译结果是不尽相同的,仅从运算符优先级和结合型不能确定最终的值。比如上式不能知道在编译后到底是先执行完三个括号里的自加,还是先执行前两个括号然后相加再执行后一个括号。这种式子属于错误表达,没有研究的价值。

原创粉丝点击