有符号数和无符号数之间的转换

有如下程序段:

char ch=-1;
printf(“%02x,%02x”,ch,(unsigned char)ch);

则输出:

A -1,-1
B ff,ff
C ffffffff,ff
D ff,ffffffff

正确答案:C
%02x表示输出最少2位,不足补0.
第一个ch=-1,负数拓展到32位需要补1,所以是ffffffff
第二个先转换为无符号数ff(255), 正数拓展补0,由于最少输出2位,所以是ff

无符号数编码:
补码编码:

有符号数和无符号数之间的转换的规则:数值可能会改变,但是位模式不变。
强制类型转换的结果保持位值不变,只是改变了解释这些位的方式。
printf输出数值时,分别用指示符%d、%u和%x以 有符号十进制、无符号十进制和十六进制格式输出一个数字。

扩展一个数字的位表示:
不同字长的整数之间转换,同时又保持数值不变。
从一个较小的数据类型转换到一个较大的类型:
(1)零扩展:无符号数。
(2)符号扩展:补码数字,即有符号数。

截断数字
将一个w位额数x 截断为一个k位数字时,我们会丢弃高w-k位,截断一个数字可能会改变它的值—溢出的一种形式。

你可能感兴趣的:(有符号数和无符号数之间的转换)