不同整型之间赋值问题

发布时间:2026/7/13 5:59:20
不同整型之间赋值问题 C语言允许不同的整型之间相互赋值char a;//8bits short b;//16bits int c;// 32bits long d; //... a b; d c; c a; .... //允许不同的整型之间的相互赋值有人提出长度不一样 如何来赋值呢C标准委员会建议采用如下策略1.长 — 短 低字节直接拷贝 高字节直接 丢弃2.短 — 长低字节直接拷贝如果 短的是 无符号数 高位补0如果 短的是 有符号数 高位补 符号位练习1.分析如下程序的结果 假设int占32bits#include stdio.h int main() { char c 250;//长 -- 短 printf(%d\n,c);//短 -- 长 -6 printf(%u\n,c);//短 -- 长 2^32 - 6 } /* typeof(250):int 250: 00000000 00000000 00000000 1111 1010 c 250; int -- char 长 -- 短 c: 1111 1010 %d: signed int c -- signed int 短 -- 长 (为什么补1 因为短的c是有符号数 所以高位补符号位 符号位(1)) 11111111 11111111 11111111 1111 1010 --- %d 是把这个当成有符号输出 11111111 11111111 11111111 1111 1001 -1 00000000 00000000 00000000 0000 0110 取反 |-6| 的原码 %u: unsigned int c -- unsigned int 短 -- 长 (为什么补1 因为短的c是有符号数 所以高位补符号位 符号位(1)) 11111111 11111111 11111111 1111 1010 --- %u 是把这个当成无符号输出 */2.分析如下程序的结果 假设int占32bitsint main() { unsigned char c 250;//长 -- 短 printf(%d\n,c);//短 -- 长 250 printf(%u\n,c);//短 -- 长 250 } /* typeof(250):int 250: 00000000 00000000 00000000 1111 1010 c 250; int -- unsigned char 长 -- 短 c: 1111 1010 %d: signed int c -- signed int 短 -- 长 (短的是c c是无符号数 都补0) 00000000 00000000 00000000 1111 1010 %u: unsigned int c -- unsigned int 短 -- 长 (短的是c c是无符号数 都补0) 00000000 00000000 00000000 1111 1010 */3.分析如下程序的结果 假设int 占32bits#include stdio.h int main() { char a 250; char d; d a 8; printf(%d\n,d);//2 printf(%u\n,d);//2 } /* typeof(250):int 250: 00000000 00000000 00000000 1111 1010 a 250; int --- char 长 --- 短 a: 1111 1010 a 8 涉及到 a 转换为int(高精度转) 再和8相加 因为8默认为 int a: signed char -- int 短 -- 长(因为短的a是有符号的 所以高位补符号位(1)) a: 11111111 11111111 11111111 1111 1010 8 : 00000000 00000000 00000000 0000 1000 a8 1 00000000 00000000 00000000 0000 0010 typeof(d):char typeof(a8):int 长 -- 短 d: 0000 0010 %d:signed int typeof(d):char char -- signed int 短 -- 长 (为什么补0 因为短的d是有符号数(signed char) 高位补符号位(0)) 00000000 00000000 00000000 0000 0010 %u:unsigned int typeof(d):char char -- unsigned int 短 -- 长 (为什么补0 因为短的d是有符号数(signed char) 高位补符号位(0)) 00000000 00000000 00000000 0000 0010 */