我嘗試將 32 位整數左移 24:
char *int_to_bin(int num) {
int i = 0;
static char bin[64];
while (num != 0) {
bin[i] = num % 2 48;
num /= 2;
i ;
}
bin[i] = '\0';
return (bin);
}
int main() {
int number = 255;
printf("number: %s\n", int_to_bin(number));
printf("shifted number: %s\n", int_to_bin(number << 24));
return 0;
}
輸出:
number: 11111111
shifted number: 000000000000000000000000/
我用 23 位左移它產生了這個結果:
0000000000000000000000011111111
那么為什么會這樣,錯誤結果末尾的'/'是怎么回事?
uj5u.com熱心網友回復:
兩件事情:
如果
number值為 255,則number << 24值為 4278190080,它溢位一個 32 位有符號整數,其最大可能值為 2147483647。有符號整數溢位是 C 中未定義的行為,因此結果可能是任何東西。在這種情況下可能發生的情況是轉變的結果是否定的。當
num為負時,則num % 2可能取值為-1,因此您將字符 47 存盤在字串中,即/。位移數學通常更適合處理
unsigned型別,其中溢位是明確定義的(它環繞并且位只是從左邊移開并消失)并且num % 2只能是 0 或 1。(或者num & 1改為寫。)您的
int_to_bin例程將最低有效位放在字串的開頭(左側),因此結果與人們通常寫數字的方式(最低有效位在右側)相反。您可能想重寫它。
uj5u.com熱心網友回復:
Shift 作業正常,您只需從錯誤的方向列印即可。
char *int_to_bin(char *buff, int num)
{
unsigned mask = 1U << (CHAR_BIT * sizeof(num) - 1);
char *wrk = buff;
for(; mask; mask >>= 1)
{
*wrk = '0' !!((unsigned)num & mask);
}
*wrk = 0;
return buff;
}
int main()
{
char buff[CHAR_BIT * sizeof(int) 1];
int number = 255;
printf("number: %s\n", int_to_bin(buff, number));
printf("shifted number: %s\n", int_to_bin(buff, number << 24));
return 0;
}
左移有符號整數是可以的,但右移是實作定義的。許多系統使用算術右移,結果與使用按位的結果不同:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373366.html
上一篇:C:列印最長公共前綴
