当在条件操作中使用移位操作时,while 循环变为无限
while loop goes infinite when used shift operations in conditon operatios
如果移位操作变为零,此循环将无限运行。不知道为什么。需要说明。
size_t size_of_byte()
{
unsigned int size = 0, i = 1;
while((i << size) > 0)
{
size++;
}
printf("The size of a byte is %u",size);
return size;
}
正在寻找更好的 link,这是来自 C++,但行为是相同的。
http://en.cppreference.com/w/cpp/language/operator_arithmetic
if the value of the right operand is negative or is greater or equal to the number of bits in the promoted left operand, the behavior
is undefined.
编译器可以假定您永远不会移动超过该整数的宽度,因此,结果永远不会为 0,因此不需要检查。这是一个完全合法的优化,你依赖 UB。
当您将 i
向 左 移动 size
并增加 size
时,很难看出您的代码将如何停止].这将呈指数增长,直到发生溢出和崩溃。如果我理解你只是想用 size_of_byte()
来确定一个字节的大小,你最好实际检查 1-byte
中的位数。按照惯例,char
的存储空间是 1-byte
,因此如果您想向自己证明它确实包含 8 位,您可以这样做:
/* return the number of bits-per-byte */
size_t szofbyte (void)
{
unsigned char c = 0;
unsigned char sz = 1;
c = ~c; /* invert the bits of c */
while ((c >>= 1)) sz++;
return sz;
}
可视化所涉及的位操作可能会有所启发。只需添加一些 printf
语句并以二进制形式输出您正在测试的变量的值,就可以显示正在发生的事情以及循环的原因和方式。这是一个带注释版本的函数的简短示例:
#include <stdio.h>
#ifndef BITS_PER_LONG
#define BITS_PER_LONG 64
#endif
size_t szofbyte_ann (void);
char *binpad (unsigned long n, size_t sz);
int main (void) {
printf ("\n the size of a byte is : %zu bits\n\n", szofbyte_ann());
return 0;
}
/* return the number of bits-per-byte (annotated) */
size_t szofbyte_ann (void)
{
unsigned char c = 0;
unsigned char sz = 1;
c = ~c; /* invert the bits of c */
printf ("\n sz : %hhu c : %s\n", sz, binpad (c, 8));
while ((c >>= 1)) {
sz++;
printf (" sz : %hhu c : %s\n", sz, binpad (c, 8));
}
return sz;
}
/* return binary representation of 'n' paddded to 'sz' chars */
char *binpad (unsigned long n, size_t sz)
{
static char s[BITS_PER_LONG + 1] = {0};
char *p = s + BITS_PER_LONG;
register size_t i;
for (i = 0; i < sz; i++)
*--p = (n>>i & 1) ? '1' : '0';
return p;
}
输出
$ ./szofbyte
sz : 1 c : 11111111
sz : 2 c : 01111111
sz : 3 c : 00111111
sz : 4 c : 00011111
sz : 5 c : 00001111
sz : 6 c : 00000111
sz : 7 c : 00000011
sz : 8 c : 00000001
the size of a byte is : 8 bits
如果移位操作变为零,此循环将无限运行。不知道为什么。需要说明。
size_t size_of_byte()
{
unsigned int size = 0, i = 1;
while((i << size) > 0)
{
size++;
}
printf("The size of a byte is %u",size);
return size;
}
正在寻找更好的 link,这是来自 C++,但行为是相同的。
http://en.cppreference.com/w/cpp/language/operator_arithmetic
if the value of the right operand is negative or is greater or equal to the number of bits in the promoted left operand, the behavior is undefined.
编译器可以假定您永远不会移动超过该整数的宽度,因此,结果永远不会为 0,因此不需要检查。这是一个完全合法的优化,你依赖 UB。
当您将 i
向 左 移动 size
并增加 size
时,很难看出您的代码将如何停止].这将呈指数增长,直到发生溢出和崩溃。如果我理解你只是想用 size_of_byte()
来确定一个字节的大小,你最好实际检查 1-byte
中的位数。按照惯例,char
的存储空间是 1-byte
,因此如果您想向自己证明它确实包含 8 位,您可以这样做:
/* return the number of bits-per-byte */
size_t szofbyte (void)
{
unsigned char c = 0;
unsigned char sz = 1;
c = ~c; /* invert the bits of c */
while ((c >>= 1)) sz++;
return sz;
}
可视化所涉及的位操作可能会有所启发。只需添加一些 printf
语句并以二进制形式输出您正在测试的变量的值,就可以显示正在发生的事情以及循环的原因和方式。这是一个带注释版本的函数的简短示例:
#include <stdio.h>
#ifndef BITS_PER_LONG
#define BITS_PER_LONG 64
#endif
size_t szofbyte_ann (void);
char *binpad (unsigned long n, size_t sz);
int main (void) {
printf ("\n the size of a byte is : %zu bits\n\n", szofbyte_ann());
return 0;
}
/* return the number of bits-per-byte (annotated) */
size_t szofbyte_ann (void)
{
unsigned char c = 0;
unsigned char sz = 1;
c = ~c; /* invert the bits of c */
printf ("\n sz : %hhu c : %s\n", sz, binpad (c, 8));
while ((c >>= 1)) {
sz++;
printf (" sz : %hhu c : %s\n", sz, binpad (c, 8));
}
return sz;
}
/* return binary representation of 'n' paddded to 'sz' chars */
char *binpad (unsigned long n, size_t sz)
{
static char s[BITS_PER_LONG + 1] = {0};
char *p = s + BITS_PER_LONG;
register size_t i;
for (i = 0; i < sz; i++)
*--p = (n>>i & 1) ? '1' : '0';
return p;
}
输出
$ ./szofbyte
sz : 1 c : 11111111
sz : 2 c : 01111111
sz : 3 c : 00111111
sz : 4 c : 00011111
sz : 5 c : 00001111
sz : 6 c : 00000111
sz : 7 c : 00000011
sz : 8 c : 00000001
the size of a byte is : 8 bits