请问a、b、c、d的值为什么分别是这样的呢?可以详细说说吗?

执行下列程序段后,a的值十六进制表示为7后面三个f ,b、c、d的值分别是-32768、-1、65535 (int型为16位)。
int a,b,c;
long d;
b=(a=32767,a+1);
c=d=0x后面四个f;

// f 在十六进制相当于 15
a=32767 = 7 * 16^3 + 15 * 16^2  + 15 * 16 ^1 + 15 * 16^0
// 逗号表达式的值 为其  最右值,计算顺序从左往右,先 a = 32767, 16位的 int类型的范围是 -32768~32767
b = a + 1 = 32767 + 1 = 32768 溢出了, 实际值为 -32768
// c和d,先算 d = 0xffff
d = 15 * 16^3 + 15 * 16^2  + 15 * 16 ^1 + 15 * 16^0 = 65535
// c 是int型,c 赋值给d,精度丢失,d的二进制值为 1111 1111 1111 1111 0000 0000 0000 0000【看实际位数,这里写了 32位】 , int 类型 取前 16位 ,值为 1111 1111 1111 1111
// 第一位为 符号位,1 表示负数,二进制这里存储的是负数的 补码,它的反码是 1111 1111 1111 1110,源码 1000 0000 0000 0001
c = -1

b=(a=32767,a+1);
等价于
a=32767;
b=a+1;
那么b=32768
因为是有符号数,所以是-32768
0xffff不是-1吗
d是long型,32位,所以是65535
这里基础是数学,你要先把10进制2进制互转到底是怎么回事搞明白
再考虑c语言里的类型到底占几个字节,会不会溢出的问题