#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define PAGES 336 //二进制原码表示为 0000 0001,0101 0100,至少可以使用2B的存储,系统一般使用补码进行数据间处理
#define WORDS 65618 //二进制原码表示为 0001,0000 0000,0101 0010
int main(void)
{
short num = PAGES;
short mnum = -PAGES;
//%hd 为 short int,%hu 为 unsigned short int
printf("num as short and unsigned short: %hd %hu\n", num,num);//输出结果为336 336
printf("-num as short and unsigned short: %hd %hu\n", mnum,mnum);//输出结果为-336 65200
//这里unsigned输出的并非期望的-336,主要是由于系统默认采用二进制补码表示有符号整数
// 由于使用补码,则0-32767(0000 0000 0000 0000-0111 1111 1111 1111)表示其自身,
// 而32768-65535(1000 0000 0000 0000-1111 1111 1111 1111,补码)表示负数(真值为-336 - -1)
// -336原码表示为1000 0001 0101 0000 1111 1110 1010 补码表示:1111 1110 0110 0000 = 65120
// 这里打印为65120的原因 是输出格式限制为unsigned int
//这里需要额外注意到的是负数补码与原码之间的转化:原码->补码:符号位不变,其余位全部取反,末位+1
printf("num as int and char: %d %c\n", num, num);//同样的,这里第二个输出结果为P原因为打印格式限制为char类型
printf("WORDS as int,short,and char:%d %hd %c\n", WORDS, WORDS, WORDS);
getchar();
return 0;
}
Cpp笔记_关于补码的一点回顾
最新推荐文章于 2024-09-16 16:07:55 发布