c/c++常見類型轉換錯誤

文章目錄

    • char轉int 高位符號擴展
    • 有符號int與無符號int比較
    • 關于一個bit的位域變量的取值范圍
    • 臨時變量溢出
    • size_t死循環

char轉int 高位符號擴展

int main() {char a = 0x9A;int util;util = (int)a;cout << a << endl;cout << util << endl;if (util > 0) {std::cout << "pos" << std::endl;} else {std::cout << "neg" << std::endl;}
}

打印結果:


-102
neg

0x9A轉換為十進制為154,所以,在把a強制轉換為int類型的變量util之后以為還是154,所以,期望輸出為“positive”。但實際上0x9A的二進制表示為10011010,在強制轉換為int時,因為int是有符號的,需要對10011010進行符號擴展,也就是用其最高位1來擴充其他 3個高字節,變成 11111111 1111111111111111 10011010(假設 int是4個字節),而這個是負數-102的二進制補碼表示。所以,在判斷util是否小于0時就會輸出“negative”。

正確做法:

int main() {char a = 0x9A;int util;util = (int)(unsigned char)a;cout << a << endl;cout << util << endl;if (util > 0) {std::cout << "pos" << std::endl;} else {std::cout << "neg" << std::endl;}
}

如果期望 0x9A為正數,實際上需要先把 a強制轉換為unsigned char。這樣0x9A才會被解析為154

有符號int與無符號int比較

int main() {int d = -1;int array[] = {23, 23, 23};cout << d << endl;cout << (unsigned int)d << endl;cout << (sizeof(array) / sizeof(array[0])) << endl;if (d < (sizeof(array) / sizeof(array[0]))) {cout << "yes" << endl;} else {cout << "no" << endl;}return 0;
}

結果:

-1
4294967295
3
no

由于sizeof()的返回類型是無符號整型

if語句在比較signed int型變量d和unsignedint型值的時候,signed int型變量被轉換為 unsigned int型變量。-1轉換成 unsigned int的結果是一個非常巨大的正整數(在 32位操作系統上會轉換成2^32-1),導致if判斷為假。

正確的做法:sizeof返回的結果強制轉換為int型。

int main() {int d = -1;int array[] = {23, 23, 23};cout << d << endl;cout << (unsigned int)d << endl;cout << (sizeof(array) / sizeof(array[0])) << endl;if (d < (int)(sizeof(array) / sizeof(array[0]))) {cout << "yes" << endl;} else {cout << "no" << endl;}return 0;
}
-1
4294967295
3
yes

關于一個bit的位域變量的取值范圍

typedef struct xxdata {int flag: 1;int other: 31;
} xxdata;
int status() {return 1;
}
int main() {xxdata test;test.flag = status();if (test.flag == 1) {cout << "test.flag = 1" << endl;} else {cout << "test.flag != 1" << endl;}
}
test.flag != 1

在結構體中定義了一個int型的位域變量,而用一個bit來表示int時,這一位是用來表示符號位的,

帶符號的一個bit的位域變量的取值范圍是0或-1(無符號的一個bit的位域變量的取值范圍是0或1)

stauts()的返回值1賦給flag時會出現溢出,flag值變為-1

下面的判斷-1就可以:

typedef struct xxdata {int flag: 1;int other: 31;
} xxdata;
int status() {return -1;
}
int main() {xxdata test;test.flag = status();if (test.flag == -1) {cout << "test.flag = -1" << endl;} else {cout << "test.flag != -1" << endl;}
}
test.flag = -1

臨時變量溢出

long mul(int m, int n) {long score;score = m * n;return score;
}

在64位操作系統下,int型通常占4個字節,long型通常占8個字節,兩個int型變量相乘的值范圍是long型變量的值范圍。score=m*n 這行代碼在執行時,m和n相乘的結果會先存儲在一個臨時的int變量中,然后再賦值給long變量score,這個臨時變量是很容易溢出的。所以,需要在表達式運算前先對m和n做數據類型轉換。

正確做法:

long mul(int m, int n) {long score;score = static_cast<long>(m) * static_cast<long>(n);return score;
}

對隱式的類型轉換,一般來說向上是安全的,向下會出現數據截斷丟失,導致數據錯誤。事實上,上述正確代碼只在long型字節數是int型字節數兩倍的情況下才是正確的,如果在某些平臺下,long 型和int 型字節數一樣的話(如32 位操作系統int型和long型通常都占4個字節),仍然需要注意兩個int型相乘結果溢出的問題。

size_t死循環

int main() {size_t size = sizeof(int);cout << size << endl;while (--size >= 0) {cout << "size = " << size << endl;}return 0;
}

while條件永遠為真,程序進入死循環

size_t是 sizeof操作符返回的結果類型,size_t在32位系統中是unsigned int,在 64位系統中是 unsigned long int。

當size的值等于0并再次作??size運算時,size會因溢出再次等于它取值范圍內的最大值,所以,size的值恒大于等于0

正確做法:

1、修改while條件

while (--size > 0) {if (size == 0) break;
}

2、使用int替代size_t

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376543.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376543.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376543.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Javascript 裝載和執行

一兩個月前在淘寶內網里看到一個優化Javascript代碼的競賽&#xff0c;發現有不少的人對Javascript的執行和裝載的基礎并不懂&#xff0c;所以&#xff0c;從那天起我就想寫一篇文章&#xff0c;但一直耽擱了。 首先&#xff0c;我想說一下Javascript的裝載和執行。通常來說&am…

java sundry tips

1.關于Arrays 記得binarySearch方法返回的int 類型的數值的含義。 If the array contains multiple elements with the specified value, there is no guarantee which one will be found. 而且當查找數小于數組中任何一個數時返回-1 &#xff0c;當查找數大于數組中任何…

c++常見的10個類對象問題

文章目錄1、對象的淺復制2、構造函數中的操作符重載3、拷貝構造函數不能模板化4、析構函數未捕獲異常導致coredump5、構造函數拋出異常6、基類析構函數非虛導致內存泄漏7、刪除void*指針引發內存泄露8、成員函數尾部缺失const9、使用memset初始化class10、對象向下轉換失敗1、對…

Ubuntu 14.10 -- 異次元軟件世界

Ubuntu 14.10 中文桌面版/服務器正式版下載 - 華麗免費易于入門的 Linux 操作系統 [ 系統工具 - Linux // 2014-10-25 ]一說到 Linux&#xff0c;就不得不提目前最紅火的 Ubuntu 發行版了&#xff01;它擁有絢麗的界面&#xff0c;甚至跟以時尚為賣點的 Mac OSX 相比也有過之而…

maven 概念

這里maven倡導約定優于配置&#xff0c;maven的約定就是以下目錄結構src/main/java 下存放java類src/main/webapp 下存放頁面文件(需要手動創建)src/main/resources 下存放資源文件src/test/java 下存放單元測試代碼src/test/resources 下存放測試資源文件 Maven運行的生命周期…

System Design筆記:在線售票系統設計

文章目錄何為在線售票系統&#xff1f;系統目標和要求1、功能要求2、非功能性需求3、設計注意事項4、容量估算5、系統API1.SearchMovies2.ReserveSeats6、數據庫設計7、高級設計8、細節模塊設計9、流程服務器如何跟蹤所有尚未預訂的active預訂&#xff1f;服務器如何跟蹤所有等…

Response.Write具體介紹

問題一&#xff1a; Response.Write 后連接Response.Redirect &#xff0c;則Response.Write無法顯示&#xff0c;直接跳轉入Response.Redirect 的頁面。 解決方案&#xff1a; Response.Write("<script langugejavascript>alert(成功改動); window.location.hrefin…

SharePoint通過IP地址訪問

問題&#xff1a;SP站點通過計算機名稱可以訪問&#xff0c;但不能通過IP地址訪問 解決方案&#xff1a;打開SharePoint2010管理中心》應用程序管理》配置備用訪問映射》編輯公用 URL 備用訪問映射集&#xff1a;選擇要映射的網站集 默認:http://計算機名 Intranet &#xff1a…

公有云與私有云的差別(轉)

公有云與私有云的差別 發現每一個公司對私有云、公有云的定義都不一樣&#xff0c;能夠從公有云與私有云的差別上理解這個概念。下面轉載網絡上一個比較淺顯的解釋&#xff1a; 差別1&#xff1a;從云的建設地點劃分&#xff0c;公有云——互聯網上公布的云計算服務&#xff1b…

流媒體協議初探(MPEG2-TS、RTSP、RTP、RTCP、SDP、RTMP、HLS、HDS、HSS、MPEG-DASH)

目錄一、綜述需求分析協議定制二、MPEG2-TS協議三、RTSP協議、RTP、RTCP、SDPRTSPRTP、RTCP、SDP四、RTMP五、HLS、HDS、HSSHLSHDS和HSS六、MPEG-DASH協議具體內容應用七、流媒體服務器流媒體服務器的功能與挑戰客戶端支持協議支持應用場景應用特點擴展技術廣告投放錄屏其他一、…

eclipse偶爾會反映遲鈍,直接無視其報錯

比如&#xff0c;你在web.xml中配置了什么東西&#xff0c;在有的時候不一定就會立即被eclipse察覺到&#xff0c;即便你的配置正確了&#xff0c;甚至重啟了幾次服務器&#xff0c;它仍然給你報錯 比如說&#xff0c;剛才我在web.xml中配置了一個taglib&#xff0c;并且tld文件…

Qos(Quality of Service)

QOS&#xff08;即Quality of Service&#xff0c;服務質量&#xff09;主要指網絡環境下服務滿足用戶的程度&#xff0c;在視頻服務的語境下也可認為是Quality of Streaming&#xff0c;即流媒體服務的質量。通常&#xff0c;QOS可以由一系列指標表達&#xff0c;如傳輸的速度…

Popline:帥氣的浮動 HTML5 文本編輯器工具欄

Popline 是一個基于 HTML5 實現的富文本編輯器工具欄&#xff0c;設計靈感來自 PopClip &#xff0c;相比傳統的文本編輯器工具&#xff0c;Popline 能夠浮動在編輯的文本周圍&#xff0c;操作起來十分方便。 您可能感興趣的相關文章Metronic – 基于 Bootstrap 響應式后臺管理…

C#反射Assembly 具體說明

1、對C#反射機制的理解 2、概念理解后&#xff0c;必須找到方法去完畢&#xff0c;給出管理的主要語法 3、終于給出有用的樣例&#xff0c;反射出來dll中的方法 反射是一個程序集發現及執行的過程&#xff0c;通過反射能夠得到*.exe或*.dll等程序集內部的信息。使用反射能夠看到…

流媒體技術優化

文章目錄1、下載策略優化CDN選擇策略錯誤處理策略碼率選擇策略2、協議和架構優化HTTP2TCP變種擁塞控制QUIC架構流媒體協議的選擇與分發體系架構的設計對優化起著關鍵作用。 HLS和DASH協議在點播和OTT直播服務中已逐漸占據主流&#xff0c;其思想主要是將視頻轉為不同碼率并切為…

Android——android必看 各個控件屬性(網上看到的文字,覺得挺好的,珍藏了)...

屬性 值 說明 Android:orientation horizontal/vertical 設置布局水平還是垂直&#xff0c;默認是垂直 android:checked true/false 標記默認選中&#xff0c;如果是單選則選中最后一個 android:layout_gravity center/right/left/bottom/top 位置 android:gravity…

java中接口的定義與實現

1、定義接口 使用interface來定義一個接口。接口定義同類的定義類似&#xff0c;也是分為接口的聲明和接口體&#xff0c;當中接口體由常量定義和方法定義兩部分組成。定義接口的基本格式例如以下&#xff1a; [修飾符] interface 接口名 [extends 父接口名列表]{ [public] …

API設計筆記:pimpl技巧

pimpl pointer to implementation&#xff1a;指向實現的指針&#xff0c;使用該技巧可以避免在頭文件暴露私有細節&#xff0c;可以促進API接口和實現保持完全分離。 Pimpl可以將類的數據成員定義為指向某個已經聲明過的類型的指針&#xff0c;這里的類型僅僅作為名字引入&am…

C++必讀書

C必讀書 《Inside The C Object Model》 《Effective C》和《More Effective C》以及《Exceptional C》 《C面向對象高效編程(C Effective Object-Oriented Software Construction)》 《面向對象軟件構造(Object-Oriented Software Construction)》 《設計模式(Design Patterns…

python socket編程實現的簡單tcp迭代server

與c/c socket編程對照見http://blog.csdn.net/aspnet_lyc/article/details/38946915 server&#xff1a; import socketPORT 9999 BACKLOG 5 MAXLINE 1024listenfd socket.socket(socket.AF_INET,socket.SOCK_STREAM) listenfd.bind((,PORT)) listenfd.listen(BACKLOG)w…