C语言unsigned int

#include<stdio.h>

void main(){
unsigned int a = -100;
printf("%d\n",a);
//printf("%x",a);
}

我在书上看到的,unsigned int 是无符号整型数,但是我用printf()打印出来的数还是-100怎么解释

那是因为你在定义a的时候就错了, 无符整形数就是不带符号的意思, 而你定义了一个符号, 这样编译器就不会把-100赋给a,而是让a发生一个类型转换, a是无符号的 -100是有符号的整形数,因此发生一个类型转化,-100被转化为了无符整数(但是它绝对不是变成了100)然后复制给a,这是为啥呢?继续往下看

你printf中 是用的是%d, 这个转换说明符的意思是把数据以有符号十进制的形式打印出来,
signed int(编译器允许简写为int)是有符整形数,他的字节不能少于2个,现在的操作系统基本上把它设置为4个字节, 对于4个字节的int 它的取值范围是-2147483647到2147483647,
对于unsigned int,他依然是4个字节,但是他的取值范围是0到4294967295,
对于signed int他是将unsigned int的0到2147483647表示为 0到2147483647,把2147483648到4294967295表示为-2147483647到-1

所以呢 我刚才说的第一段中的-100并不是变成了100的愿意,他变成了-100对应的那个无符整数,存在a中,然后你用%d把a输出, 由于%d,它又从这个无符的整数转变为-100输出了出来

对于输出unsigned int 应该用%u输出, 如果还有疑问可以继续问我,
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-02-28
其实它存进去的是-100的补码,然后你读的时候用%d读,它以为是有符号数,就把补码翻译回来,读成了-100。如果你用%u来读,你读到的肯定不是-100,因为它会以为是无符号数,它不会将原来的补码翻译,而是“直译”成正整数。本回答被提问者和网友采纳
第2个回答  2014-03-12
数据存进去都是那个二进制编码,读出来就看你怎么读了。
这里你的变量的确是无符号的,但是,%d表示以有符号的数据输出,所以有负数了。这里你可以使用%u。这样输出就是正数了。
第3个回答  2014-03-12
打印语句中的转换说明不对。应该是printf("%u\n",a); d代表十进制int类型。u代表无符号十进制数
第4个回答  2014-03-12
你赋值的时候A被强制转换了,请参阅强制转换。
相似回答