C中的unsigned是否执行任何内部作业?
自从我开始用C语言编程已经有一段时间了,但是,我仍然对C中的unsigned是否执行任何内部作业?,c,unsigned,C,Unsigned,自从我开始用C语言编程已经有一段时间了,但是,我仍然对无符号感到困惑。如果我们编译此代码: #include <stdio.h> int main(int argc, char **argv) { unsigned int x = -1; return 0; } #包括 int main(int argc,字符**argv) { 无符号整数x=-1; 返回0; } gcc和VC++在使用带未签名的的负数时不会产生任何错误,甚至不会发出警告 我的问题是,unsi
无符号感到困惑。如果我们编译此代码:
#include <stdio.h>
int main(int argc, char **argv)
{
unsigned int x = -1;
return 0;
}
#包括
int main(int argc,字符**argv)
{
无符号整数x=-1;
返回0;
}
gcc和VC++在使用带未签名的
的负数时不会产生任何错误,甚至不会发出警告
我的问题是,unsigned
是否执行任何内部作业,或者它只是一个提示程序该值不应为负值?尝试通过以下方式在gcc中启用警告:gcc-Wall-o out input.c
unsigned int
和普通int
之间的另一个区别是:int
使用4个字节的范围:2147483648到2147483647;unsigned
使用4个字节的范围:0到4294967295。您不必存储有关符号的信息(最高位),这样就可以分配更大的值,应用程序将正常工作。尝试通过以下方式在gcc中启用警告:gcc-Wall-o out input.c
unsigned int
和普通int
之间的另一个区别是:int
使用4个字节的范围:2147483648到2147483647;unsigned
使用4个字节的范围:0到4294967295。您不必存储有关符号(最高位)的信息,这样就可以分配更大的值,应用程序将正常工作。这不仅仅是一个提示。以下两个代码段的行为应该不同:
签名整数:
int x = -1;
printf("%d\n", x > 0); // prints 0
unsigned int x = -1;
printf("%d\n", x > 0); // prints 1
无符号整数:
int x = -1;
printf("%d\n", x > 0); // prints 0
unsigned int x = -1;
printf("%d\n", x > 0); // prints 1
你可能会再举5个例子来说明签名的重要性。例如,使用>
操作符向右移动。这不仅仅是一个提示。以下两个代码段的行为应该不同:
签名整数:
int x = -1;
printf("%d\n", x > 0); // prints 0
unsigned int x = -1;
printf("%d\n", x > 0); // prints 1
无符号整数:
int x = -1;
printf("%d\n", x > 0); // prints 0
unsigned int x = -1;
printf("%d\n", x > 0); // prints 1
你可能会再举5个例子来说明签名的重要性。例如,使用>
运算符右移。内部(机器级)指令有符号和无符号版本,用于计算乘法mul
(无符号)和imul
(有符号)。编译器在将变量声明为无符号或有符号时选择它们。用于计算的内部(机器级)指令有符号和无符号版本,例如乘法mul
(无符号)和imul
(有符号)。编译器在您将变量声明为无符号或有符号时选择它们。使用-Wsign conversion
获得带有gcc
的警告
对于gcc
4.7.1,-Wsign转换既不是-Wall
的一部分,也不是-Wextra
的一部分
还请注意,C标准不需要此初始化警告。使用-Wsign conversion
获得带有gcc
的警告
对于gcc
4.7.1,-Wsign转换既不是-Wall
的一部分,也不是-Wextra
的一部分
还请注意,C标准不要求对此初始化发出警告。无符号
会影响整数溢出、比较和按位移位行为。它不仅仅是一个不应为负的“提示”。无符号
会影响整数溢出、比较和按位移位行为。它不仅仅是一个不应该是负数的“提示”。unsigned
不是像static
、extern
、const
或inline
那样的限定符。它是类型的一部分
int
和unsigned int
是两种完全不同的类型。您将永远找不到可以容纳负数的无符号int
。还要注意,int
和signed int
是完全相同的类型。对于char
,这是一个稍微不同的故事,但我将把它留到另一个时间
将-1
赋值给无符号整数是将其设置为可容纳的最大值的常见技巧。无符号
不是像静态
、外部
、常量
或内联
那样的限定符。它是类型的一部分
int
和unsigned int
是两种完全不同的类型。您将永远找不到可以容纳负数的无符号int
。还要注意,int
和signed int
是完全相同的类型。对于char
,这是一个稍微不同的故事,但我将把它留到另一个时间
将-1
赋值给无符号整数是将其设置为最大值的常用技巧。((无符号int)-1)
相当于(UINT_MAX)
(
),因为从负值到无符号值的转换保证由模运算完成
C11§6.3.1.3有符号和无符号整数
2否则,如果新类型为无符号
,则该值将通过
重复地加上或减去一个大于最大值
可以在新类型中表示,直到值在
新型的
((unsigned int)-1)
相当于(UINT_MAX)
(
),因为从负值到无符号值的转换保证由模运算完成
C11§6.3.1.3有符号和无符号整数
2否则,如果新类型为无符号
,则该值将通过
重复地加上或减去一个大于最大值
可以在新类型中表示,直到值在
新型的
显然,您在编译时未启用任何优化。请提高警告级别。MSVC对此确实有警告,但它需要/W4
,我相信GCC也有警告。-Wall-pedantic没有显示任何关于