【发布时间】:2020-07-31 15:35:42
【问题描述】:
我知道unsigned int的范围是0
但是,当我在 C(visual 2015) 中这样输入时
void main(){
unsigned int k = -10;
printf("%d",k);
}
那为什么电脑在屏幕上打印-10??我认为应该有错误。
【问题讨论】:
-
尝试使用
%u说明符。
标签: c
我知道unsigned int的范围是0
但是,当我在 C(visual 2015) 中这样输入时
void main(){
unsigned int k = -10;
printf("%d",k);
}
那为什么电脑在屏幕上打印-10??我认为应该有错误。
【问题讨论】:
%u 说明符。
标签: c
int 默认存储带符号的数字,这意味着它们的范围可以从 -2,147,483,648 到 2,147,483,647。 unsigned int 表示您不会使用负数,因此范围要大得多,因为您已经释放了数字中最左边的位,该位通常用于指示它是否有符号(负数)。所以unsigned int 可以从 0 变为 4,294,967,295。这也适用于像 char 这样的类型,它们通常从 -128 到 127,当 unsigned 时,char 恰好保存一个字节,或者从 0 到 255。
Visual Studio(和大多数编译器)应该在尝试将有符号值存储到无符号类型时发出警告。
当您使用printf("%d",k) 时,%d 告诉printf() 打印出签名的int。这就是它所做的。如果您希望printf() 打印出unsigned int,则需要使用printf("%u")。
【讨论】:
十六进制形式,-10 为 0xFFFFFFF6
unsigned int k = -10; 表示
unsigned int k = 0xFFFFFFF6;
当你说打印这个值时
printf("%d",k); 由于 %d 说明符,编译器会将值 (0xFFFFFFF6) 评估为整数。 (检查http://www.cplusplus.com/reference/cstdio/printf/关于这个问题)
如果您说printf("%u",k);,编译器会将值 (0xFFFFFFF6) 评估为无符号整数,并将打印介于 0-2^32-1 之间的值
【讨论】: